我想在Oracle 10g中创建一个可延迟的唯一功能索引。
我知道如何创建一个独特的功能索引:
create unique index LIST_ITEM_ENTRY_NO_UNIQ
on LIST_ITEM (case status when 'cancel' then null else LIST_KEY end,
case status when 'cancel' then null else ENTRY_NO end);
我知道如何创建一个可延迟的唯一索引:
alter table LIST_ITEM add constraint LIST_ITEM_ENTRY_NO_UNIQ
unique (LIST_KEY,ENTRY_NO) deferrable initially deferred;
知道这两件事,我试过了:
alter table LIST_ITEM add constraint LIST_ITEM_ENTRY_NO_UNIQ
unique (case STATUS when 'cancel' then null else LIST_KEY end,
case STATUS when 'cancel' then null else ENTRY_NO end)
deferrable initially deferred;
但是我收到“ORA-00904:无效标识符”错误。要么我的语法错误,要么Oracle不支持可延迟的功能索引?有人可以给我一个解决方案或一个明确的答案吗?
答案 0 :(得分:5)
很好的尝试,但根据Oracle 10g文档,CREATE INDEX和ALTER TABLE ADD CONSTRAINT的语法在这方面不可互换,这就是为什么你会遇到语法错误:
CREATE INDEX ::=
CREATE [ UNIQUE | BITMAP ] INDEX [ schema. ]index
ON { cluster_index_clause
| table_index_clause
| bitmap_join_index_clause
} ;
table_index_clause ::=
[ schema. ]table [ t_alias ]
(index_expr [ ASC | DESC ]
[, index_expr [ ASC | DESC ] ]...)
[ index_properties ]
index_expr ::= { column | column_expression }
因此CREATE INDEX允许column_expression,它基本上是一个“基于函数的索引”。
另一方面:
ALTER TABLE ::=
ALTER TABLE [ schema. ]table
[ alter_table_properties
| column_clauses
| constraint_clauses
| alter_table_partitioning
| alter_external_table_clauses
| move_table_clause
]
[ enable_disable_clause
| { ENABLE | DISABLE }
{ TABLE LOCK | ALL TRIGGERS }
[ enable_disable_clause
| { ENABLE | DISABLE }
{ TABLE LOCK | ALL TRIGGERS }
]...
] ;
constraint_clauses ::=
{ ADD { out_of_line_constraint
[ out_of_line_constraint ]...
| out_of_line_REF_constraint
}
| MODIFY { CONSTRAINT constraint
| PRIMARY KEY
| UNIQUE (column [, column ]...)
}
constraint_state
| RENAME CONSTRAINT old_name TO new_name
| drop_constraint_clause
}
out_of_line_constraint ::=
[ CONSTRAINT constraint_name ]
{ UNIQUE (column [, column ]...)
| PRIMARY KEY (column [, column ]...)
| FOREIGN KEY (column [, column ]...)
references_clause
| CHECK (condition)
}
[ constraint_state ]
因此,UNIQUE约束定义可能只是列名,不能是列表达式。
你可以使用虚拟列在11g中执行此操作,在10g和更早版本中,大多数人倾向于创建派生列(以及以编程方式保持最新版本的负担)。
答案 1 :(得分:1)
我认为您需要11g virtual columns功能。您将该函数创建为虚拟列,然后在其上添加cosntraint。
答案 2 :(得分:-2)
Ask Tom解决了这个问题。答案是否定的,您无法根据功能索引创建唯一约束。