MySQL - 在多列上一起创建非空表

Omi*_*mid 5 mysql sql database check-constraints

无论如何要创建一个包含多列的表,其中 2 个在同一记录中永远不应该为空。

例如,我需要以某种方式制作C,如果另一个不在同一记录中D,它们中的每一个都可能是。nullnull

我有什么办法吗?

| A | B | C | D | E |
|---|---|---|---|---|
|   |   |   |   |   |
|   |   |   |   |   |
|   |   |   |   |   |
Run Code Online (Sandbox Code Playgroud)

他们永远不应该在一起有价值

Bil*_*win 4

正如 @lad2025 提到的,MySQL 不支持 CHECK 约束。正如@RaymondNijland 评论的那样,您可以使用触发器来执行此操作。

它可能如下所示(在 MySQL 5.6.37 上测试):

mysql> DELIMITER ;;

mysql> CREATE TRIGGER not_both_null BEFORE INSERT ON a_table_with_multiple_columns 
  FOR EACH ROW BEGIN
    IF (NEW.c IS NULL AND NEW.d IS NULL) THEN
      SIGNAL SQLSTATE '45000'
        SET MESSAGE_TEXT = 'One of C and D must be non-null';
    END IF;
  END ;;

mysql> DELIMITER ;

mysql> insert into a_table_with_multiple_columns set c=null, d=null;                                                                                                                      
ERROR 1644 (45000): One of C and D must be non-null
Run Code Online (Sandbox Code Playgroud)

请记住创建一个类似的触发器BEFORE UPDATE来检查无效条件,否则无效数据可能会在创建行后通过 UPDATE 潜入。