我有一个包含 4 个唯一列的表
我试过这样的东西:
ALTER TABLE "FolderDsg" ADD CONSTRAINT CHK4_FOLDERDSG CHECK (ORDER2 = ORDER3)
ALTER TABLE "FolderDsg" ADD CONSTRAINT CHK11_FOLDERDSG CHECK (ORDER1 not in (ORDER2))
ALTER TABLE "FolderDsg" ADD CONSTRAINT CHK13_FOLDERDSG CHECK (ORDER1 like (ORDER2))
/******************************************************************************/
/* Unique Constraints */
/******************************************************************************/
ALTER TABLE "FolderDsg" ADD CONSTRAINT UNQ1_FOLDERDSG UNIQUE (ORDER1)
USING INDEX "_IDXORDER1"
它适用于每一列。但是我怎样才能为所有 4 列创建一个唯一的呢?
+------+------+------+------+
|Order1|Order2|Order3|Order4|
+------+------+------+------+
|1 |2 |3 |4 | = valid OK Check
+------+------+------+------+
|5 |5 |6 |7 | = not valid ( That works in the Database )
+------+------+------+------+
|8 |9 |10 |11 | = valid OK Check
+------+------+------+------+
|12 |13 |9 |14 | = valid ( That's the Problem ) I need a not valid
+------+------+------+------+
最佳答案
你试过吗?
ALTER TABLE "FolderDsg" ADD CONSTRAINT CHECK (ORDER1 not in (ORDER2, ORDER3, ORDER4) and
ORDER2 not in (ORDER3, ORDER4) and
ORDER3 not in (ORDER4)
);
编辑:
如果您还希望列中的值是唯一的,您可以添加四个唯一约束:
ALTER TABLE "FolderDsg" ADD CONSTRAINT UNIQUE (ORDER1);
ALTER TABLE "FolderDsg" ADD CONSTRAINT UNIQUE (ORDER2);
ALTER TABLE "FolderDsg" ADD CONSTRAINT UNIQUE (ORDER3);
ALTER TABLE "FolderDsg" ADD CONSTRAINT UNIQUE (ORDER4);
编辑二;
而且,如果您真的希望所有列中的所有值都不同,您有两种选择。第一种是使用 before update
/before insert
触发器。第二种更可取:以规范化格式存储数据。
创建一个表,每个“FolderDsg”和订单各占一行:
create table FolderDsgOrder (
FolderDsgId int,
OrderNum int,
OrderValue int
/* whatever else you want goes here */
);
现在您可以创建简单的约束:
alter table FolderDsgOrder add constraint unique (OrderValue);
关于sql - 将四个表列限制为 Firebird DBMS 中的不同值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21222775/