MySQL5.7で、チェック制約を実現したいです。
こちらのページを拝読しますと、チェック制約の式はSELECT時と同じに見えました。
なので以下CONSTRAINT check_fks CHECK ()
で# 三つのうちどれか一つだけという制約
をかけてみました。
SQL
1CREATE TABLE mytable4 ( 2 ID INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, 3 name VARCHAR(10), 4 PRIMARY KEY (ID) 5); 6 7CREATE TABLE mytable3 ( 8 ID INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, 9 number INT(3), 10 PRIMARY KEY (ID) 11); 12 13CREATE TABLE mytable2 ( 14 ID INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, 15 address VARCHAR(10), 16 PRIMARY KEY (ID) 17); 18 19CREATE TABLE IF NOT EXISTS mytable1 ( 20 ID INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, 21 mytable2_ID INT(10) UNSIGNED, # どれか一つだけ入る 22 mytable3_ID INT(10) UNSIGNED, # どれか一つだけ入る 23 mytable4_ID INT(10) UNSIGNED, # どれか一つだけ入る 24 PRIMARY KEY (ID), 25 FOREIGN KEY (mytable2_ID) REFERENCES mytable2(ID), 26 FOREIGN KEY (mytable3_ID) REFERENCES mytable3(ID), 27 FOREIGN KEY (mytable4_ID) REFERENCES mytable4(ID), 28 CONSTRAINT check_fks CHECK ( 29 # 三つのうちどれか一つだけという制約 30 (mytable2_ID IS NOT NULL) AND (mytable3_ID IS NULL) AND (mytabl4_ID IS NULL) OR 31 (mytable2_ID IS NULL) AND (mytable3_ID IS NOT NULL) AND (mytabl4_ID IS NULL) OR 32 (mytable2_ID IS NULL) AND (mytable3_ID IS NULL) AND (mytabl4_ID IS NOT NULL) 33 ) 34);
しかし以下で、mytable1
の3行目のレコードのINSERT
で、( 3,1,NULL )
と指定しており、つまりmytable2_ID
とmytable3_ID
の二つに値を入れてしまっており、これは制約に違反するためにエラーにしたいのですが、普通に成功してしまいます。
SQL
1INSERT INTO mytable4 ( name ) 2VALUES ( 'Steve' ),( 'Rob' ),( 'Eric' ); 3 4INSERT INTO mytable3 ( number ) 5VALUES ( 100 ),( 200 ),( 300 ); 6 7INSERT INTO mytable2 ( address ) 8VALUES ( 'a' ),( 'b' ),( 'c' ); 9 10INSERT INTO mytable1 ( mytable2_ID, mytable3_ID, mytable4_ID ) 11VALUES ( 1,NULL,NULL ),( NULL,2,NULL ),( 3,1,NULL ); 12# ( 3,1,NULL ) というINSERTは制約に違反するためエラーにしたい
どのようにすれば# 三つのうちどれか一つだけという制約
の部分の制約はうまくいきますでしょうか?
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/29 09:30