3

私は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; 


  • 「PHPMyAdminで作業しない」を定義します。おそらくあなたはすでに持っていますnullその列の値。その場合、DBはその制約を追加できません(少なくともそれらを変更しない限り)null以外の値null最初)。 - Matt Ball
  • 新しい列を作成してデータをコピーしようとしましたか。 - Hajo
  • この列には既にnull値が設定されていません。他の3つのクエリを試したときのエラーは次のとおりです。#1064 - SQL構文にエラーがあります - Anon
  • @MДΓΓБДLLこれをテストし、NULL値を持つvarcharカラムをNOT NULLに変更したときに、問題なく制約が追加されました。 NULL値は自動的に空白文字列に変更されました(データの「切り捨て」に関する警告付き)。 - octern

4 답변


5

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

これらのテストが期待通りに動作すれば、すべて問題ありません。実際のところ、空白文字列が挿入されないようにしたいのです。チェックアウトこの質問提案については、またはクエリの前に、検証中に空白文字列を確認するだけです。


  • 正しいテストはWHERE token_message IS NULL。 Nullとの比較はできません=。 - yper-crazyhat-cubeᵀᴹ
  • ありがとう。 =は予期しない型変換の原因となる厳密ではない比較になると想定していましたが、SQLでの動作方法とはまったく異なります(これまでのところ、3値論理全体の重要性を考えるとわかります)。 。回答を編集しました。 - octern

2

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


  • これは事実であり、最初のクエリが機能しなかった後に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値を挿入することはできません。


  • この質問はSQL-ServerではなくMySQLでタグ付けされています。 - yper-crazyhat-cubeᵀᴹ
  • よろしいですか。同じプロセス、異なる構文 - Russell Fox

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

リンクされた質問


関連する質問

最近の質問