【问题标题】:MYSQL table column contraint based upon another tables columns基于另一个表列的MYSQL表列约束
【发布时间】:2016-03-29 21:26:29
【问题描述】:

这是我的第一篇文章,我是一个 mysql 菜鸟,所以对于这个问题的长度,我深表歉意。

背景

我有一个查找表cctypevals,带有一个外部字段“cctypeID”,在 mysql 中这将是:

CREATE TABLE `cctypevals` (
`cctypevalsKEY`  integer NOT NULL AUTO_INCREMENT PRIMARY KEY , 
`cctypeID`  varchar(50) NOT NULL, FOREIGN KEY(cctypeID) REFERENCES cctype(cctypeID) , 
`value`  varchar(50)  ) 

cctypeID 包含来自用户表的字段名称,例如“taskSTATE”、“serviceTYPE”、“projectCAT”等。

值字段包含这些用户表字段的唯一允许值。

因此cctypevals 就像一个“多”键查找表,例如:

从 cctypevals 中选择值,其中 cctypeID ='serviceTYPE'

可能会返回 HomeVisit、BackToBase 等

我知道每个字段有一个查找表会更容易,但这就是我所拥有的。

问题

我如何约束(在 sql create table 或 alter 语句中)具有诸如 task.taskSTATE、service.serviceTYPE 等字段的表,以便它们只能接受来自 cctypevals.value 的值,其中 cctypeID 包含合适的字段名?

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    在 create 或 alter table 语句中你不能这样做,因为 check 约束可以做这样的事情,但是 mysql 还没有实现 check 约束(mysql 可以解析检查约束,但它不会工作)。

    您可以在插入和更新触发器之前创建检查特定限制和raise an sql error message,如果更新的值不符合要求。

    【讨论】:

    • 谢谢。所以在触发器中我会运行一个选择并检查值是否在其中?您认为唯一的其他方法是将当前查找表分解为单独的表吗?
    • 或者使用枚举或集合,但那些破坏了外键的全部目的。所以,是的,要么使用触发器,要么为每种查找类型使用单独的查找表。
    • 再次感谢 - 我会调查一下。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-03
    • 2011-03-29
    • 1970-01-01
    • 2020-05-16
    • 1970-01-01
    相关资源
    最近更新 更多