MySQL - 在多个列上一起创建不为空的表

标签 mysql sql database check-constraints

有没有办法创建一个包含多列的表,并且其中 2 列在同一记录中永远不应该为空。

例如,我需要制作CD不知何故,他们每个人都可能是null如果另一个不是 null在同一条记录中。

我有什么办法吗?

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

而且它们在一起永远不应该有值(value)

最佳答案

如 @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 潜入。

关于MySQL - 在多个列上一起创建不为空的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49902512/

相关文章:

mysql - 如何保护 WordPress 中的插入语句?

mysql - SQL:n级分层结构

mysql - 将表连接到另一个表后查询表的每一行

php - Amazon SNS 移动推送 - 如何发送/发布到多个终端节点?

mysql - 连接 2 个表的值并显示数据

javascript - 正则表达式 (JavaScript) 创建数据验证,其中数字必须大于 x

mysql - 如何判断JOIN的结果是否为NULL?

mysql - 在Mysql中显示每个group by中最大值的行

c# - LINQ-to-SQL 连接中的 DefaultIfEmpty 导致重复

sql - 构建数据库表的最佳方式是什么?