MYSQL约束 - 多次检查

时间:2010-03-06 22:58:49

标签: mysql database constraints alter-table

我在这里为我正在处理的数据库编写一些约束,我想知道我是否可以执行以下操作:

ALTER TABLE Course
ADD CONSTRAINT cs_level
CHECK (clevel in ('P','I','II','III'))

......而不是:

ALTER TABLE Course
ADD CONSTRAINT cs_level
CHECK (clevel = 'P' OR clevel = 'I' OR clevel = 'II' OR clevel = 'III')

3 个答案:

答案 0 :(得分:2)

不幸的是,MySQL不支持CHECK约束。它们被解析但被忽略。

From the reference manual

  

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

在插入行之前,您可以尝试将此检查约束放在业务逻辑中。

正如Joe Celko在他的书Joe Celko's SQL for Smarties中所说:

  

小型“伪SQL”产品已经出现在开源领域。 MySQL之类的语言在语法和语义方面与标准SQL非常不同,通常只是带有借用保留字的文件系统接口

确实有点苛刻,但在某种程度上他是正确的,因为MySQL不支持一堆标准SQL功能。

答案 1 :(得分:2)

即使MySQL强制执行CHECK限制,我仍然会创建一个COURSE_LEVEL表:

  • COURSE_LEVEL_CODE,VARCHAR(3),主键
  • COURSE_LEVEL_DESCRIPTION,VARCHAR(120)

...并在COURSE表格clevel列上创建一个FOREIGN KEY约束:

ALTER TABLE COURSE
ADD FOREIGN KEY (clevel) REFERENCES COURSE_LEVEL(COURSE_LEVEL_CODE)

答案 2 :(得分:0)

MySQL仅支持外键约束,不支持约束。无论你从哪里获得这种语法,都不是MySQL手册。