选中约束赢得';t工作mysql
检查约束不起作用选中约束赢得';t工作mysql,mysql,sql,check-constraints,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 dep
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检查约束。 因此,请尝试改用
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
);
MySQL不强制执行检查约束 这是对SQL标准的一个有充分记录的偏差。(尽管外行没有料到这一点。) 如果需要MySQL数据库强制执行“检查约束”,则必须在插入之前将强制编码为
,在更新之前编码为
本说明:
CHECK
子句已被解析,但被所有存储引擎忽略
在MySQL参考手册中的CREATE TABLE
语法下
参考:
有关枚举的警告
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
我们必须使用检查约束。我想这样做:P.不幸的是,MySQL不支持SQL检查约束,因为据我所知,MySQL不支持check
约束。CHECK
子句已解析,但被所有存储引擎忽略。来自StackOverflow帮助中心:。谢谢,现在我不知道这是否是我老师想要的。对我们来说似乎有点过分,但他会知道我们不能使用检查约束。感谢hlepI,我希望你的老师会很高兴地发现你发现CHECK
子句被接受了,但它不是由MySQL强制执行的。他会很高兴你测试了它,并发现了这一点。如果需要在数据库中强制执行此操作,MySQL中唯一可用的机制就是插入前的和更新前的触发器。“理论上,理论和实践没有区别。实际上是有区别的。”当你告诉老师这一发现时,确保您有一个演示测试用例。SQL Fiddle在这方面非常方便,课程材料是为与Oracle、SQL Server、DB2、Teradata等一起使用而开发的,并且还没有针对MySQL进行更新。或者,你的老师正在创造一个环境,让你学会如何自学。老师可能想强调考试的重要性。