mysql-同时在多个列上创建不为null的表

envsm3lx  于 2021-06-25  发布在  Mysql
关注(0)|答案(2)|浏览(368)

是否仍要创建一个包含多个列的表,并且在同一条记录中,其中两个列不应为null。
例如,我需要 C 以及 D 他们每个人都可能 null 如果另一个不是 null 同样的记录。
我知道有什么办法吗?

| A | B | C | D | E |
|---|---|---|---|---|
|   |   |   |   |   |
|   |   |   |   |   |
|   |   |   |   |   |

他们不应该在一起有价值

j8ag8udp

j8ag8udp1#

mysql不支持check约束,正如@lad2025所提到的。正如@raymondnijland评论的那样,您可以通过触发器来实现这一点。
下面是它的样子(在MySQL5.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潜入。

sulc1iza

sulc1iza2#

你可以使用 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演示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子句已被解析,但被所有存储引擎忽略。

相关问题