2008-10-23 57 views
2

我正在创建一个看起来像这样的表。如何确保一列包含一组值中的一个?

CREATE TABLE packages 
(
    productCode char(2) 
    , name nvarchar(100) 
    , ... 
) 

我如何确保产品代码始终是两个值XJXD之一?

+0

7年后看了这个问题,如果我再做一遍,我会添加一个表和一个外键。用于文档“XJ是什么意思?”和数据仓库以及DBMS之间更好的可移植性。 – 2015-03-07 12:35:11

回答

10
ALTER TABLE packages 
ADD CONSTRAINT constraintname CHECK (productCode in ('XJ', 'XD')) 
+0

我建议使用查找表为未来的扩展原因。在表中插入另一行比找出如何重新约束要容易得多。 – 2008-10-23 18:23:16

+0

是的,我在这种情况下调用YAGNI。 :-) – 2008-10-23 18:33:26

3
CREATE TABLE packages 
(
    productCode char(2) 
    , name nvarchar(100) 
    , ... 
    ,CONSTRAINT productCode CHECK (productCode in ('XJ','XD')) 
) 
1

在这种情况下,它听起来像valueset的产品代码是相当有限的,不要期望它在可预见的未来成长,所以我倾向于checkconstraint的答案一致。但是,在大多数情况下,我会按照格兰特先生的建议实施外键解决方案,因为我的客户每天大约有一次改变主意(以及需求)的恶习。在这种情况下,我认为FK版本更容易维护。

相关问题