MySQL - 在多个列上同时创建 table 和 not null
MySQL - creating table with not null on multiple columns together
是否可以创建一个包含多列的 table,其中 2 列在同一记录中永远不应为空。
例如,我需要以某种方式使 C
和 D
如果另一个不在同一记录中,则它们中的每一个都可以是 null
.
我有什么办法吗?
| A | B | C | D | E |
|---|---|---|---|---|
| | | | | |
| | | | | |
| | | | | |
而且他们在一起永远不应该有价值
您可以使用 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))
);
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:
The CHECK clause is parsed but ignored by all storage engines.
MySQL 不支持 CHECK 约束,如@lad2025 所述。正如@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
记得创建一个类似的触发器 BEFORE UPDATE
来检查无效条件,否则无效数据可能会在创建行后通过 UPDATE 潜入。
是否可以创建一个包含多列的 table,其中 2 列在同一记录中永远不应为空。
例如,我需要以某种方式使 C
和 D
如果另一个不在同一记录中,则它们中的每一个都可以是 null
.
我有什么办法吗?
| A | B | C | D | E |
|---|---|---|---|---|
| | | | | |
| | | | | |
| | | | | |
而且他们在一起永远不应该有价值
您可以使用 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))
);
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:
The CHECK clause is parsed but ignored by all storage engines.
MySQL 不支持 CHECK 约束,如@lad2025 所述。正如@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
记得创建一个类似的触发器 BEFORE UPDATE
来检查无效条件,否则无效数据可能会在创建行后通过 UPDATE 潜入。