[解決済み] SQLカラム定義:デフォルト値とnot nullは冗長?
2022-12-23 09:46:22
質問
create/alter DDL ステートメントでカラムを定義する以下の構文を何度も目にしたことがあります。
ALTER TABLE tbl ADD COLUMN col VARCHAR(20) NOT NULL DEFAULT "MyDefault"
問題は、デフォルト値が指定されているので、カラムがNULLを受け入れないように指定する必要があるかどうかです。言い換えれば、DEFAULT は NOT NULL を冗長にしませんか?
どのように解決するのですか?
DEFAULT
は、挿入/更新ステートメントで明示的な値がない場合に挿入される値です。あなたのDDLに
NOT NULL
制約がなかったとします。
ALTER TABLE tbl ADD COLUMN col VARCHAR(20) DEFAULT 'MyDefault'
そして、以下のようなステートメントを発行することができます。
-- 1. This will insert 'MyDefault' into tbl.col
INSERT INTO tbl (A, B) VALUES (NULL, NULL);
-- 2. This will insert 'MyDefault' into tbl.col
INSERT INTO tbl (A, B, col) VALUES (NULL, NULL, DEFAULT);
-- 3. This will insert 'MyDefault' into tbl.col
INSERT INTO tbl (A, B, col) DEFAULT VALUES;
-- 4. This will insert NULL into tbl.col
INSERT INTO tbl (A, B, col) VALUES (NULL, NULL, NULL);
また、この他に
DEFAULT
で
UPDATE
ステートメントによると
SQL-1992
標準に従います。
-- 5. This will update 'MyDefault' into tbl.col
UPDATE tbl SET col = DEFAULT;
-- 6. This will update NULL into tbl.col
UPDATE tbl SET col = NULL;
すべてのデータベースが、これらの標準SQL構文をすべてサポートしているわけではないことに注意してください。このため
NOT NULL
制約を追加すると、ステートメントでエラーが発生します。
4, 6
という制約があります。
1-3, 5
はまだ有効なステートメントです。ですから、あなたの質問に答えます。いいえ、それらは冗長ではありません。
関連
-
[エラー処理] [MySQL] [Err] 1241 - オペランドは 1 つのカラムを含む必要があります。
-
[解決済み] SQLサーバーでNULL = NULLがfalseに評価される理由
-
[解決済み] SQL ServerでJOINを使用してUPDATE文を実行するにはどうすればよいですか?
-
[解決済み] SQL Serverにおける関数とストアドプロシージャの比較
-
[解決済み] SQLの複数列の順序付け
-
[解決済み] カラム名の変更 SQL Server 2008
-
[解決済み] 既存のカラムにデフォルト値を設定する方法
-
[解決済み] VARCHARとCHARの違いは何ですか?
-
[解決済み】SQL Serverで既存のテーブルにデフォルト値を持つカラムを追加する
-
[解決済み] SQL関数をデフォルトのパラメータ値として使用できますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] MySQLの「スキーマの作成」と「データベースの作成」 - 違いはあるのか?
-
[解決済み] SQLサーバーでNULL = NULLがfalseに評価される理由
-
[解決済み] SQLのSELECTでIF...THENを実行するにはどうすればよいですか?
-
[解決済み] SQL Serverでテーブルからカラム名を取得するにはどうすればよいですか?
-
[解決済み] postgres: ユーザーをスーパーユーザーにアップグレードしますか?
-
[解決済み] SQL ServerにおけるINSERT OR UPDATEに関する解決策
-
[解決済み] SQLite - UPSERT *not* INSERT or REPLACE
-
[解決済み] SQLでランダムな行を要求する方法は?
-
[解決済み] 項目xにアクセスできるように文字列を分割するにはどうすればよいですか?
-
[解決済み] SQL ServerでINSERT INTOとしてデータをエクスポートする