无论如何都要创建一个包含多列的表,其中2列永远不应该在同一条记录中为空。
例如,我需要以某种方式使C
和D
null
如果另一个人在同一记录中不是null
,那么每个人都可以| A | B | C | D | E |
|---|---|---|---|---|
| | | | | |
| | | | | |
| | | | | |
我有什么办法吗?
var/logs/dev.log
他们永远不应该有共同的价值
答案 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潜入。