MySQL - 在多个列上创建非空的表

时间:2018-04-18 14:37:19

标签: mysql sql database check-constraints

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

例如,我需要以某种方式使CD null如果另一个人在同一记录中不是null,那么每个人都可以| A | B | C | D | E | |---|---|---|---|---| | | | | | | | | | | | | | | | | | |

我有什么办法吗?

var/logs/dev.log

他们永远不应该有共同的价值

2 个答案:

答案 0 :(得分:3)

您可以使用CHECK约束来实现它:

CREATE TABLE tab(i INT PRIMARY KEY,
                 a INT,
                 b INT,
                 c INT,
                 d INT 
                 CHECK (NOT(c IS NULL AND d IS NULL))
                 );

<强> DBFiddle Demo-MariaDB

INSERT INTO tab(i,a,b,c,d) 
VALUES(1,1,1,NULL,NULL);
-- error: CONSTRAINT `d` failed for `tab`

INSERT INTO tab(i,a,b,c,d) 
VALUES(2,1,1,1,NULL);
-- ok

INSERT INTO tab(i,a,b,c,d) 
VALUES(3,1,1,NULL,1);
-- ok

INSERT INTO tab(i,a,b,c,d) 
VALUES(4,1,1,1,1);
-- ok

不幸的是在MySQL create-table

  

CHECK子句被解析但被所有存储引擎忽略。

答案 1 :(得分:2)

MySQL不支持CHECK约束,如@ lad2025所述。您可以使用触发器执行此操作,如@RaymondNijland所述。

以下是它的外观(在MySQL 5.6.37上测试):

Benchmark        Mode  Cnt      Score   Error  Units
Test.benchSort1  avgt    2      0.307          ms/op
Test.benchSort2  avgt    2  15145.611          ms/op
Test.benchSort3  avgt    2      0.210          ms/op

请记住创建一个类似的触发器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 以检查无效条件,否则无效数据可能会在创建行后通过UPDATE潜入。