【发布时间】:2016-03-17 20:34:58
【问题描述】:
我创建了一个具有复合唯一键的表,如下所示--
create table test11
(
aa number,
bb varchar2(10),
cc DATE,
dd number,
ee NUMBER
);
CREATE UNIQUE INDEX TEST11_IDX ON TEST11 (AA,BB,CC);
现在,每当我尝试插入数据时,都会出现以下错误:
ORA-00001:违反了唯一约束 (CDUREFDB.TEST11_IDX)
INSERT INTO TEST11 VALUES (1, 'AA', SYSDATE, 1, 1);
commit;
INSERT INTO TEST11 VALUES (1, 'AA', SYSDATE, 1, 1);
commit;
那是因为DATE 列正在考虑Date 值直到几秒钟?
因为我可以看到下面的查询返回的是结果--
select to_char(CC,'DD-Mon-YY HH:Mi:SS AM') from test11;
TO_CHAR(CC,'DD-MON-YYHH:MI:SSAM')
---------------------------------
17-Mar-16 04:28:37 PM
17-Mar-16 04:28:43 PM
那么,为了只将日期值(不是小时、分钟、秒精度)视为唯一的关键成员,可以做些什么。
另外,DATE 上面的列(CC)上有分区。
更新::
在这张表中,我们在 DATE 列 (CC) 上有 RANGE 分区。
我们计划定期删除分区(即间隔几天后)。
因此,如果我不在唯一索引中使用直接 CC(而不是按照 Justin 的建议进行 trunc),那么如果我在删除某些旧分区后尝试插入数据,则会收到 ORA-01502: index 'CDUREFDB.TEST111_IDX' or partition of such index is in unusable state 错误。
UPDATE_1 根据下面的@Justin 建议,此问题已解决,创建如下虚拟列:
CREATE TABLE TEST11
(
AA NUMBER,
BB VARCHAR2(10),
CC DATE,
DD NUMBER ,
EE NUMBER,
FF DATE generated always AS (TRUNC(CC)) virtual
)
PARTITION BY RANGE
(
FF
)
INTERVAL
(
NUMTODSINTERVAL(1,'DAY')
)
(
PARTITION partition_test_1 VALUES LESS THAN (TO_DATE('01-APR-2006','dd-MON-yyyy'))
);
CREATE UNIQUE INDEX TEST111_IDX ON TEST11 (AA,BB,FF) LOCAL; -- creating unique local index
【问题讨论】:
标签: oracle11g unique-constraint