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潜入。
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
2条答案
按热度按时间j8ag8udp1#
mysql不支持check约束,正如@lad2025所提到的。正如@raymondnijland评论的那样,您可以通过触发器来实现这一点。
下面是它的样子(在MySQL5.6.37上测试):
记住创建一个类似的触发器
BEFORE UPDATE
检查无效条件,否则在创建行之后,无效数据可能会通过update潜入。sulc1iza2#
你可以使用
CHECK
约束条件:dbfiddle演示mariadb
不幸的是,在mysql create table中:
check子句已被解析,但被所有存储引擎忽略。