添加唯一约束列
问题描述:
的计算值,我不完全知道如何短语这一点,但在这里不用... 我们有类似如下的表结构:添加唯一约束列
Id | Timestamp | Type | Clientid | ..others..
001 | 1234567890 | TYPE1 | CL1234567 |.....
002 | 1234561890 | TYPE1 | CL1234567 |.....
现在的上面给出的数据...我想有一个约束,以便这两行不能一起存在。从本质上讲,我想表是
Unique for (Type, ClientId, CEIL(Timestamp/10000)*10000)
我不想与对方的X时间内创建要添加到数据库相同的数据行,即想违反约束在这种情况下。问题是,上述约束不是我实际可以创建的。
在你问,我知道,我知道....为什么是正确的?那么我知道某种情况不应该发生,但可惜。我现在需要一种止损措施,所以我可以花一些时间来调查实际情况。如果您需要更多信息,请告知我...
答
是的,Oracle支持计算列:
SQL> alter table test add calc_column as (trunc(timestamp/10000));
Table altered.
SQL> alter table test
add constraint test_uniq
unique (type, clientid, calc_column);
Table altered.
应该做你想要什么。
答
AFAIK,Oracle不支持像SQL Server这样的计算列。您可以使用触发器模拟计算列的功能。
下面是步骤执行这一
- 添加一个名为
CEILCalculation
到表列。- 你的桌子上,把一个触发器将与值更新
CEILCalculation
从CEIL(Timestamp/10000)*10000
- 在三列
(Unique for (Type, ClientId, CEILCalculation)
- 你的桌子上,把一个触发器将与值更新
创建唯一索引如果你不想修改表结构,你可以把BEFORE INSERT TRIGGER
放在桌子上,并检查那里的有效性。
http://www.techonthenet.com/oracle/triggers/before_insert.php
+0
Thx的快速信息...我也想过这个...我想避免添加列等,并修改架构太多。问题是表格是巨大的,经常使用/更新 – 2010-07-13 19:08:02
类似的问题,但如果我不得不添加一个新的列,这看起来像要走的路。我喜欢使用trunc的想法,而不是我正在做的事情(少一个数学运算)。现在看看数据库人员是否发现这种并发症。 – 2010-07-13 19:36:40