私はPHPMyAdminを使用していて、テーブルの列にNOT NULL制約を追加しようとしています。
PHPMyAdminは私の以下のクエリを受け付けます。
ALTER TABLE `wall` MODIFY `token_message` varchar(40) NOT NULL;
しかし、私はまだ空の文字列(= NULL)を挿入することができます、なぜかわかりません。
シモンズ:この制約を追加するために他の質問をしてもらおうと思ったら、PHPMyAdminではうまくいかないこれら3つを試してみた(エラーの種類:#1064 - あなたのSQL文法にエラーがある) ;マニュアルを確認してください。
ALTER TABLE `wall` ALTER COLUMN `token_message` SET NOT NULL;
ALTER TABLE `wall` ALTER COLUMN `token_message` varchar(40) NOT NULL;
ALTER TABLE `wall` MODIFY `token_message` CONSTRAINTS token_message_not_null NOT NULL;
あなたは「私はまだ空の文字列(= NULL)を挿入することができます」と書いていますが、それは誤解のように思えます。 SQLでは、空の文字列はNULLと評価されず、その逆も同様です。空の文字列を挿入してやってみてくださいSELECT from wall where token_message is NULL
。あなたはゼロ行を取り戻すべきです。それからあなたが指定したところに挿入をしてみてください。NULL
列の値として(引用符で囲まれていない)をクリックすると、予期したエラーメッセージが表示されます。
これらのテストが期待通りに動作すれば、すべて問題ありません。実際のところ、空白文字列が挿入されないようにしたいのです。チェックアウトこの質問提案については、またはクエリの前に、検証中に空白文字列を確認するだけです。
WHERE token_message IS NULL
。 Nullとの比較はできません=
。 - yper-crazyhat-cubeᵀᴹ
MySQLの列変更構文では、列を完全に再指定する必要があります。列の属性を1つだけ変更することはできません。列を完全に再定義する必要があります。
ALTER TABLE wall MODIFY token_message varchar(40) NOT NULL default ''
許可されている唯一の 'SET'バージョンは、デフォルト値を変更することです。
参照:http://dev.mysql.com/doc/refman/5.1/en/alter-table.html
これはあなたの意見をスクラブすることの問題だと思います。前述のとおり、空の文字列( '')はsqlのNULL値ではありません。これを処理する最善の方法は、空白文字、さらに空白文字を削除するストアプロシージャを介した更新のみを許可することです。
CREATE PROC InsertIntoMyDb (@MyVarChar VARCHAR(2000)) AS
SET @MyVarChar = NULLIF(RTRIM(LTRIM(@MyVarChar)), '')
INSERT INTO [TBL] (MyVarChar)
VALUES @MyVarChar
これは、任意の数のスペースを空の文字列に切り捨て、空の文字列をNULLに変換します。その後、すでに配置されている制約に基づいてNULL値を挿入することはできません。
このクエリを使ってみてください
Alter table table_name
change column_name column_name datatype(length) definition
すなわち
Alter table wall
change tocken_message tocken_message varchar(40) NOT NULL DEFAULT
null
その列の値。その場合、DBはその制約を追加できません(少なくともそれらを変更しない限り)null
以外の値null
最初)。 - Matt Ball