MySQL - 在多个列上同时使用not null创建表

6
有没有办法创建一个多列表格,其中两列在同一条记录中永远不应该是空的?
例如,我需要使C和D成为每个记录中互相依存的可空列。
有什么方法吗?
| A | B | C | D | E |
|---|---|---|---|---|
|   |   |   |   |   |
|   |   |   |   |   |
|   |   |   |   |   |

他们不应该同时具有价值。

问题有点奇怪,但你可以使用触发器来处理这个用户案例。 - Raymond Nijland
1
我删除了php和mysqli标签,因为这个问题与PHP无关。 - Bill Karwin
2个回答

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

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


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的创建表中:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接