gpt4 book ai didi

oracle - 我可以在 Oracle 中拥有可延迟的唯一功能索引吗?

转载 作者:行者123 更新时间:2023-12-04 13:05:06 24 4
gpt4 key购买 nike

我想在 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 不支持可延迟的函数索引?有人可以为我提供解决方案或明确的答案吗?

最佳答案

不错的尝试,但根据 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 和更早的版本中,大多数人倾向于创建派生列(以及以编程方式使它们保持最新的负担)。

关于oracle - 我可以在 Oracle 中拥有可延迟的唯一功能索引吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/837306/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com