3

PHPMyAdmin を使用しており、テーブルの列に 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; 
4

4 に答える 4

6

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

これらのテストが期待どおりに機能する場合は、すべて問題ありません。実際の問題は、空白の文字列が挿入されないようにすることです。質問の前に、この質問で提案を確認するか、検証中に空白の文字列を確認してください。

于 2012-04-18T21:34:55.270 に答える
3

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

于 2012-04-18T21:42:31.537 に答える
0

これは入力をスクラブすることの問題だと思います。octernが述べたように、空の文字列('')はsqlではNULL値ではありません。これを処理する最良の方法は、空白文字も含めて空の文字列を削除するストアドプロシージャを介してのみ更新を許可することです。

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

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

INSERT INTO [TBL] (MyVarChar)
VALUES @MyVarChar

これにより、任意の数のスペースが空の文字列に切り捨てられ、空の文字列がNULLに変換されます。その後、すでに設定されている制約に基づいてNULL値を挿入することはできません。

于 2012-04-18T22:09:13.747 に答える
0

このクエリを使用してみてください

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
于 2014-01-20T04:40:55.693 に答える