如何确保一列包含一组值中的一个?
Posted
技术标签:
【中文标题】如何确保一列包含一组值中的一个?【英文标题】:How do I ensure a column contains one of a set of values? 【发布时间】:2008-10-23 18:13:27 【问题描述】:我正在创建一个看起来像这样的表格。
CREATE TABLE packages
(
productCode char(2)
, name nvarchar(100)
, ...
)
如何确保 productCode 始终是 XJ
或 XD
两个值之一?
【问题讨论】:
7年后再看这个问题,如果我再做一遍,我会添加一个表和一个外键。用于文档“XJ 是什么意思?” DBMS 之间的数据仓库和更好的可移植性。 【参考方案1】:ALTER TABLE packages
ADD CONSTRAINT constraintname CHECK (productCode in ('XJ', 'XD'))
【讨论】:
出于未来扩展的原因,我建议使用查找表。向表中插入另一行比弄清楚如何重做约束要容易得多。 是的,在这种情况下我调用了 YAGNI。 :-) 这适用于 Oracle、mysql 等吗?我使用的是 MS SQL Server 2000,但如果解决方案非常标准,请注意并删除 sqlserver 标记。 甲骨文,是的。 Mysql - 我认为不是。 Mysql 似乎想对列进行约束,而不是检查行的有效性。 MySQL 不支持 CHECK 约束。他们可以用他们专有的 ENUM 数据类型做类似的事情。【参考方案2】:要么将 foreign key 设为查找表,要么添加 check constraint 以强制执行。
【讨论】:
【参考方案3】:CREATE TABLE packages
(
productCode char(2)
, name nvarchar(100)
, ...
,CONSTRAINT productCode CHECK (productCode in ('XJ','XD') )
)
【讨论】:
第一个“productCode”不应该是约束名而不是列名吗? 它是 -- 当然你可以给它命名,但是如果我在单个列上放置一个检查约束,我通常只使用列名。 酷。我一直认为约束不能与同一个表中的列同名。【参考方案4】:在这种情况下,ProductCode 的值集听起来非常有限,并且您不希望它在可预见的未来增长,所以我倾向于同意 checkconstraint 的答案。但是,在大多数情况下,我会按照格兰特先生的建议实施外键解决方案,因为我的客户有一个讨厌的习惯,即每天大约改变一次想法(以及要求)。在这种情况下,FK 版本更易于维护是我的期盼。
【讨论】:
以上是关于如何确保一列包含一组值中的一个?的主要内容,如果未能解决你的问题,请参考以下文章