2016-04-29 6 views
0

私は以下のようなテーブルを作成しています。NOT NULLチェックが効かない

create table modifications (
    id bigint(20) AUTO_INCREMENT not null primary key, 
    type varchar(100), 
    user_id bigint(20) null, 
    vulnerability_id bigint(20) null 
) 
alter table modifications 
    add constraint fk_user_id foreign key (user_id) references app_user(id) 
alter table modifications 
    add constraint fk_vulnerability_id foreign key (vulnerability_id) references vulnerabilities(id) 
alter table modifications 
    add constraint ck_OneIsNotNull check (user_id is not null or vulnerability_id is not null) 
alter table modifications 
    add constraint ck_OneIsNull check (user_id is null or vulnerability_id is null) 

私の目的は、列の1つがnullであり、もう1つがnullでないはずです。しかし、nullを挿入したり、nullでない場合は、エラーをスローせずに受け入れます。ここで私が使用した挿入クエリです。

insert into modifications (type,user_id,vulnerability_id) values('vulnerability',16,65) 
insert into modifications (type) values('vulnerability') 

どこが間違っていましたか?

+0

エラーが表示された場合は、貼り付けておくと役立ちます。 –

+0

私は何の誤りもありません。それは挿入されています。 – Rajesh

答えて

2

MySQLはCHECK制約を強制しません。

これはMySQL Reference Manualに記載されています。

このような制約を適用するために、BEFORE INSERTトリガーとBEFORE UPDATEトリガーを作成できます。例えば

DELIMITER $$ 

CREATE TRIGGER modifications_bi 
BEFORE INSERT ON modifications 
FOR EACH ROW 
BEGIN 
    IF (NEW.user_id IS NULL AND NEW.vulnerability_id IS NULL) 
    OR (NEW.user_id IS NOT NULL AND NEW.vulnerability_id IS NOT NULL) THEN 
     SIGNAL SQLSTATE '45000' 
     SET MESSAGE_TEXT = 'Error: one must be null and one must be non-null'; 
    END IF; 
END$$ 

DELIMITER ; 

あなたが5.5前のバージョンを実行している場合は、SIGNAL構文がサポートされていません。例外をスローするには、例外を発生させるSQL文を実行する必要があります。

関連する問題