检查约束将无法正常工作

时间:2015-06-04 05:47:13

标签: mysql sql check-constraints

检查约束无效

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);

2 个答案:

答案 0 :(得分:3)

MySQL不会强制执行检查约束。

这是一个有据可查的偏离SQL标准。 (虽然不知名的是出乎意料。)

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

本说明:

  

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

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

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

关于ENUM的警告

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

答案 1 :(得分:0)

不幸的是,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    
);