如何在可能具有空值的字段上创建唯一索引(Oracle 11g)?
技术问答
313 人阅读
|
0 人回复
|
2023-09-14
|
这是具有3列(ID,UNIQUE_VALUE,UNIQUE_GROUP_ID)的示例表! g, V. M, @ W. p$ c
我希望下面的记录可以被允许:
$ {& S& P- f$ Y(1, NULL, NULL)
+ X) u% V ]) m1 g(2, NULL, NULL)
( Q# \1 o9 _- L! k或者% U g: a' W: _+ H* r" L
(3, NULL, 7)
3 S6 I' s5 z* e/ u% P(4, 123, 7)3 g- x" |! N0 l1 p+ A* `5 k% z
或( 注:这种情况是不允许的unique index,也不unique constraint)
! _+ u* b9 [5 o; C& C(5, NULL, 7)
/ W1 m" B+ {7 B& e(6, NULL, 7)
( M% N# \: }% I9 \! V并且这些是不允许的:) v- R- _5 V* X$ B- \3 @
(7, 123, 7)* B* D$ c) L. E6 {4 d1 u# S! E" T
(8, 123, 7)
% ^" Z! x% ?% K: r! m我在最后2列上创建了唯一索引,但是仅允许前2个示例。 Y; f3 I" p( n" E2 {
仅当两者都不为null时,才可以让db检查这两列的唯一性吗?
, m% z: f( k' ?' A; r$ S
8 f+ _ v# R0 n, v/ i. `& u4 B! Y解决方案:
! p$ U" {* m% {9 f# t
. e5 v+ n- p$ f# v. J3 J+ k
1 M/ B* L0 k# r4 n
- F0 K5 w7 l& U& k+ q5 y& u; { 您只想对UNIQUE_VALUE和UNIQUE_GROUP_ID都不为空的行实施唯一性。为此,您可以使用基于函数的唯一索引:1 l( {/ |1 O) h4 ^7 i: r$ x7 l
CREATE UNIQUE INDEX func_based_index ON the_table
2 w7 L! e& h; K! k (CASE WHEN unique_value IS NOT NULL+ `. Z& N% a* n
AND unique_group_id IS NOT NULL5 S3 T3 T3 o8 F7 ~* L# r# s3 t
THEN UNIQUE_VALUE || ',' || UNIQUE_GROUP_ID
, L2 ^: @" O% z9 A# ~$ T END); |
|
|
|
|
|