【问题标题】:check constraint won't work mysql [duplicate]检查约束不起作用mysql [重复]
【发布时间】:2015-08-18 14:13:48
【问题描述】:

检查约束不起作用

CREATE TABLE IF NOT EXISTS supervisor (
sup_id INT(3) NOT NULL,
sup_name VARCHAR(30) NOT NULL,
gen VARCHAR(1) NOT NULL CHECK (gen='M' or gen='F'),
dep_id INT(4),

PRIMARY KEY (sup_id),
INDEX (dep_id),

FOREIGN KEY (dep_id)
    REFERENCES department(dep_id)
    ON UPDATE CASCADE ON DELETE RESTRICT    
);

我也试过了:

 CONSTRAINT chk_supervisor_gen CHECK ('M' or 'F')

这些都没有阻止输入此信息

INSERT
INTO supervisor (sup_id, sup_name, gen, dep_id)
VALUES  
       (1, 'hello', 'G', 1);

【问题讨论】:

标签: mysql sql check-constraints


【解决方案1】:

MySQL 不强制检查约束。

这是一个有据可查的与 SQL 标准的偏差。 (虽然这出乎外行人的意料。)

如果您需要 MySQL 数据库强制执行“检查约束”,则必须将强制执行编码为 BEFORE INSERTBEFORE UPDATE 触发器。


本说明:

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

隐藏在 MySQL 参考手册中,使用 CREATE TABLE 语法。

参考:https://dev.mysql.com/doc/refman/5.5/en/create-table.html


关于枚举的警告

ENUM 不限制插入“无效”值;无效值被转换为长度为零的字符串,发出警告,但不是错误。

演示:

CREATE TABLE foo (gen ENUM('M','F'))

INSERT INTO foo (gen) VALUES ('x')

-- Warning Code : 1265
-- Data truncated for column 'gen' at row 1

SELECT gen, CHAR_LENGTH(gen) FROM foo;

-- gen  CHAR_LENGTH(gen)  
-- ---  ----------------
--                     0

【讨论】:

  • 谢谢,现在我很困惑这是否是我老师想要的。对我们来说似乎有点多,但他会知道我们不能使用检查约束。谢谢你的帮助
  • 我希望您的老师会很高兴地发现您发现CHECK 子句被接受,但 MySQL 并未强制执行它。他会很高兴您对其进行了测试并发现了这一点。如果需要在数据库中强制执行此操作,BEFORE INSERTBEFORE UPDATE 触发器是 MySQL 中唯一可用的真正机制。
  • “理论上,理论和实践没有区别,实践中是有区别的。”当你告诉你的老师这个发现时,确保你有一个演示测试用例。对于这个SQL Fiddle Demonstration http://sqlfiddle.com/#!9/27a45/1,SQL Fiddle 真的很方便
  • 可能,课程材料是为与 Oracle、SQL Server、DB2、Teradata 等一起使用而开发的,并且尚未针对 MySQL 进行更新。或者,您的老师正在创造一个您正在学习如何自学的环境。很可能,老师想强调测试的重要性。
【解决方案2】:

不幸的是 MySQL 不支持 SQL 检查约束。 所以尝试改用enum

CREATE TABLE IF NOT EXISTS supervisor (
sup_id INT(3) NOT NULL,
sup_name VARCHAR(30) NOT NULL,
gen enum('M','F') NOT NULL,
dep_id INT(4),

PRIMARY KEY (sup_id),
INDEX (dep_id),

FOREIGN KEY (dep_id)
    REFERENCES department(dep_id)
    ON UPDATE CASCADE ON DELETE RESTRICT    
);

【讨论】:

猜你喜欢
  • 2018-03-11
  • 1970-01-01
  • 2011-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多