2

我的表由两列组成:A和B,它们都是可以为空的,并且是来自其他表的外键。我该如何施加一个约束,即A或B中至少有一个不应该为空?MySQL:两个字段中的至少一个的约束

+0

MySQL根本不支持检查约束。 [从文档](http://dev.mysql.com/doc/refman/5.1/en/create-table.html)“CHECK子句已解析,但被所有存储引擎忽略。” – Andomar

+0

删除了答案,我没有意识到你正在使用MySQL。 – ClaireG

+0

如果它们是外键,这是否意味着您有其他具有可空主键的表?这听起来不对。 –

回答

0

可能的答案:请提供意见,如果有一个更好的解决方案。

我发现this由Roland Bouman提供的解决方案。根据他的方案的精神,这里是我有:

delimiter go 

create procedure validateAtLeastOneValue(
    in a bigint(16), in b bigint(16) 
) 
deterministic 
no sql 
_main: begin 
    declare err_no value_specified condition for sqlstate '45000'; 

    if a is not null then 
     leave _main; -- nothing to validate 
    end if; 
    if b is not null then 
     leave _main; -- nothing to validate 
    end if; 
    signal err_no_value_specified -- raise an error 
    set message_text = 'No value specified'; 
end; 
go 

delimiter ; 

现在,从上表中插入(或更新)的事件处理程序调用该程序。

create trigger on_before_insert 
before insert on mytable 
for each row 
begin 
    call validateAtLeastOneType(
     NEW.a 
    , NEW.b 
    ); 
end; 

create trigger on_before_update 
before update on mytable 
for each row 
begin 
    call validateAtLeastOneType(
     NEW.a 
    , NEW.b 
    ); 
end; 
0

可以使A和B不为空(但零是确定),并在两列添加一个唯一的密钥:

ALTER TABLE TableName 
ADD CONSTRAINT AB UNIQUE (A,B) 
+0

但是这会对A B施加唯一性作为组合,对吗?这不是我想要的。 – Neel

+1

正确,如果您想要在多个记录上使用相同的组合,则不太好。 – Pierre

相关问题