2012-04-18 9 views
3

PHPMyAdminを使用していて、NOT NULL制約をテーブルのカラムに追加しようとしています。カラムにNOT NULL制約を追加する

PHPMyAdminのは、私の次のクエリ受け入れ:

ALTER TABLE `wall` MODIFY `token_message` varchar(40) NOT NULL; 

をしかし、私はまだ空の文字列(= NULL)を挿入することができ、私はなぜ理解していません。

PS:この制約を追加するための他のクエリを私に与えるつもりなら、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; 
+0

定義

Alter table table_name change column_name column_name datatype(length) definition 

このクエリを使用してみてください "私のPHPMyAdminのでは動作しません。"おそらくあなたは既にその列に 'null'値を持っているでしょう。その場合、DBはあなたがその制約を追加することを許さないでしょう(少なくとも' null'値を 'null'以外のものにする必要はありません)。 –

+0

新しい列を作成してデータをコピーしようとしましたか? – Hajo

+0

私は既に確認済みですが、私はまだその列にnull値がありません。私が3つの他のクエリを試してみたときのエラーは次のとおりです。#1064 - SQL構文にエラーがあります – Anon

答えて

5

あなたは誤解のように聞こえる「私はまだ空の文字列(= NULL)を、挿入することができます」、書きました。 SQLでは、空の文字列はNULLに評価されません。逆もまた同様です。空の文字列を挿入し、SELECT from wall where token_message is NULLを実行してみてください。ゼロ行戻す必要があります。次に、列の値としてNULL(引用符なし)を指定して挿入を試してください。予想されるエラーメッセージが表示されます。

これらのテストが期待どおりに機能する場合は、すべて問題はなく、空の文字列が挿入されないようにすることが実際問題です。 this questionで提案を確認するか、クエリの前に確認の際に空の文字列を確認してください。

+1

正しいテストは 'WHERE token_message IS NULL'です。ヌルと '='を比較することはできません。 –

+0

ありがとうございます。私は、=予想外の型変換を説明する厳密ではない比較を与えるだろうと仮定していましたが、それはSQLでどのように動作するのか全く分かりません(三項論理全体の重要性を考慮して、私は私の答えを編集しました。 – octern

2

MySQLの列変更構文では、列を完全に再指定する必要があります。あなたはちょうどあなたがそれを完全に再定義する必要があり、列の一つの属性を変更することはできません。

ALTER TABLE wall MODIFY token_message varchar(40) NOT NULL default '' 

許可された唯一の「SET」バージョンは、デフォルト値を変更することです。

REF:http://dev.mysql.com/doc/refman/5.1/en/alter-table.html

+0

これは当てはまり、最初のOPが機能しなかった後にOPが試した代替クエリに関連しています。しかし、元の問題は説明できません。最初に試したクエリは完全に合法で受け入れられました(デフォルト値はありませんでしたが、これはオプションです)。 – octern

0

私は、これはあなたの入力をスクラブの問題だと思います。前述したように、空文字列( '')はsqlのNULL値ではありません。これは、空の文字列に任意の数のスペースを切り捨てます

CREATE PROC InsertIntoMyDb (@MyVarChar VARCHAR(2000)) AS 

SET @MyVarChar = NULLIF(RTRIM(LTRIM(@MyVarChar)), '') 

INSERT INTO [TBL] (MyVarChar) 
VALUES @MyVarChar 

、に空の文字列を回す:これを処理するための最良の方法は、空の文字列も空白文字を取り除き、ストア手順で更新ができるようにすることですNULLを使用すると、すでに設定されている制約に基づいてNULL値を挿入できません。

+0

質問にはSQL ServerではなくMySQLが付けられています。 –

+0

おっと、そうです。同じプロセス、異なる構文。 –

0

すなわち、

Alter table wall 
change tocken_message tocken_message varchar(40) NOT NULL DEFAULT 
関連する問題