【问题标题】:MYSQL Contraints - Multiple ChecksMYSQL 约束 - 多重检查
【发布时间】:2010-03-06 22:58:48
【问题描述】:

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

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

【问题讨论】:

  • 您使用的是什么数据库? MySQL 不检查约束。在 PostgreSQL 中,这两种语法都很好。

标签: mysql database constraints alter-table


【解决方案1】:

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

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

...并在COURSEclevel 列上创建 FOREIGN KEY 约束:

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

【讨论】:

  • 是的,我想过这样做。有点像查找表。
【解决方案2】:

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

From the reference manual:

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

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

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

小型“伪 SQL”产品已经出现在开源领域。 MySQL 等语言在语法和语义上与标准 SQL 有很大不同,通常只是一个借用保留字的文件系统接口

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

【讨论】:

  • 这有点可悲,但确实如此。
【解决方案3】:

MySQL 只支持外键约束,不支持检查约束。无论您从哪里获得该语法,它都不是 MySQL 手册。

【讨论】:

    猜你喜欢
    • 2018-03-11
    • 2023-03-13
    • 2014-06-28
    • 1970-01-01
    • 1970-01-01
    • 2011-01-28
    • 2015-08-18
    • 2018-08-04
    • 1970-01-01
    相关资源
    最近更新 更多