回答

收藏

如何在可能具有空值的字段上创建唯一索引(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);
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则