3

我正在尝试为 SQL 中的一个字段编写一个检查约束,该约束允许一系列字符串(在本例中为省名)或空白值。当前代码是这样的:

ALTER TABLE CODEDLOCATION
ADD CHECK (ADM1='Central' OR ADM1='East' OR ADM1='Far-Western' OR ADM1='Mid-Western' OR ADM1='West')

这适用于 ADM1 字段,但如果新记录中的 ADM1 字段存在空白/空值,则会导致错误。我尝试了以下两个选项,但都不起作用:

ALTER TABLE CODEDLOCATION
ADD CHECK (ADM1='' OR ADM1='Central' OR ADM1='East' OR ADM1='Far-Western' OR ADM1='Mid-Western' OR ADM1='West')

ALTER TABLE CODEDLOCATION
ADD CHECK (ADM1=null OR ADM1='Central' OR ADM1='East' OR ADM1='Far-Western' OR ADM1='Mid-Western' OR ADM1='West')

将 HSQLDB 与 OpenOffice Base 一起使用。谢谢!

PS我在这里使用检查而不是外键约束的原因与使用OO Base表单的一些挑战有关......

4

2 回答 2

6

nulls 是用is运算符而不是=运算符计算的:

ALTER TABLE CODEDLOCATION
ADD CHECK 
(ADM1 IS null OR 
 ADM1 = 'Central' OR 
 ADM1 = 'East' OR 
 ADM1 = 'Far-Western' OR 
 ADM1 = 'Mid-Western' OR 
 ADM1 = 'West')
于 2014-05-28T19:34:34.477 回答
2

从严格建模的 pov 来看,最好的解决方案是查找表并将该ADM1字段作为它的外键。FK 字段可以为空,但如果不是,则必须引用查找表中定义的条目:“Central”、“East”等。

优点是:

  • 如果您拥有或将拥有同一域的另一个字段,它也可以定义为 FK。您不必从此字段中剪切/粘贴检查约束。
  • 如果您必须更改有效值列表,您只需更新查找表。否则,您必须遍历所有ADM1字段并发出 Alter Table 语句来更改约束。然后(取决于 DBMS)您可以重新编译引用您刚刚更改的表的触发器和 SP。此外,通常情况下,Alter Table 命令保留给 DBA,而您的开发人员应该能够执行插入/更新。

有些人可能会提到的一个缺点是您必须执行连接才能检索字段的内容。很少有足够的影响来考虑问题,尤其是在小型查找表中。连接之于 RDBMS,就像编译之于编程开发​​一样。如果你真的想要,你可以解决它,但你为什么想要呢?

于 2014-05-29T18:30:00.910 回答