mysql - 如何在创建列上设置条件

标签 mysql sql

如果 year 列不是 2014 或 2015,我希望插入语句失败

我需要从数据库端执行此操作作为临时措施,直到我可以访问应用程序代码

CREATE TABLE `movies` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(345) DEFAULT NULL,
  `year` int(11) DEFAULT NULL,
  `imdbid` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4545 DEFAULT CHARSET=utf8;

最佳答案

添加一个检查约束

CREATE TABLE `movies` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(345) DEFAULT NULL,
  `year` int(11) DEFAULT NULL,
  `imdbid` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`id`),
CHECK `year` in (2014,2015)
) ENGINE=InnoDB AUTO_INCREMENT=4545 DEFAULT CHARSET=utf8;

ALTER TABLE `movies`
ADD constraint checkyear check (`year`in (2014,2015))

编辑

根据 jarlh 的更新,CHECK 约束不能很好地与 mysql 配合使用。 根据 MySQL Reference Manual

The CHECK clause is parsed but ignored by all storage engines

您可以创建一个Trigger 来模拟一个CHECK 约束。像这样。

CREATE TRIGGER trg BEFORE INSERT ON movies
FOR EACH ROW BEGIN
IF (New.year NOT IN(2014,2015))
THEN
    signal sqlstate '45000'
    set message_text = 'check failed';
END IF;
END;

您可以引用以下主题以获取更多信息

CHECK constraint in MySQL is not working

Can a MySQL trigger simulate a CHECK constraint?

关于mysql - 如何在创建列上设置条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29515122/

相关文章:

mysql - Spring Boot 截断连接 url 中的最后两个字符

python - 如何通过 Python 从 Azure Functions 连接到 Azure MySQL

sql - 扩展存储在 JSONB 中的对象数组

sql - Hive中哪一个更快? “in”或 “or”?

sql - 正则表达式匹配字符串和插入符号 (^) 之间的所有内容,不包括插入符号 (^)

php - 在mysql中搜索不带连字符

PHP 面向对象编程 : How do I create a database class?

Mysql连接查询问题

sql - Entity Framework 为一列选择具有最大值的行

mysql - 有聚合函数时如何获得最大时间?