【问题标题】:Unique case insensitive constraint in oracle databaseoracle数据库中唯一不区分大小写的约束
【发布时间】:2014-11-20 05:56:32
【问题描述】:

我的表中有一个 varchar 列用于 url 值。我必须在不区分大小写的情况下使其在记录中独一无二。 我找到了两种方法来实现它。

  1. 在字段上创建唯一索引。

    create unique index <index_name> on <tablename>(lower(<column_name>))
    
  2. 在字段上添加唯一约束为

    ALTER TABLE person ADD CONSTRAINT person_name_unique
    UNIQUE(LOWER(first_name),LOWER(last_name));
    

从上述选择中采用什么有效的方法?

【问题讨论】:

  • 这是对差异的非常全面的解释,没有明确评论效率:stackoverflow.com/a/7522004/110933
  • 唯一约束在后台使用唯一索引,它们之间没有区别,唯一的区别是语法。
  • 我更喜欢约束;区别在于语义。未来的开发人员可能会将约束视为一种文档形式:“这必须是不区分大小写的唯一”。唯一索引 OTOH 可能被解释为仅出于性能目的而创建:“此列恰好始终是不区分大小写的唯一”

标签: oracle


【解决方案1】:

更有效的方法是第一种方法。但是,它更有效,只是因为后一种语法不起作用。遗憾的是,您不能像创建唯一索引一样创建基于函数的约束。

唯一约束不起作用

SQL> create table person (
  2    first_name varchar2(10),
  3    last_name  varchar2(10)
  4  );

Table created.

SQL> ALTER TABLE person ADD CONSTRAINT person_name_unique
  2  UNIQUE(LOWER(first_name),LOWER(last_name));
UNIQUE(LOWER(first_name),LOWER(last_name))
       *
ERROR at line 2:
ORA-00904: : invalid identifier

然而,一个独特的基于函数的索引确实有效

SQL> create unique index idx_uniq_name
  2      on person( lower(first_name), lower(last_name) );

Index created.

【讨论】:

  • 谢谢,那么,如果我们创建一个唯一的基于函数的索引,那么我们不需要/我们不应该在列上添加唯一约束?
  • @user1116119 - 您不能在函数值上创建唯一约束,只能创建基于函数的唯一索引。根据您的 Oracle 版本,您还应该能够创建一个计算列 lower(first_name) 并在其上创建一个唯一约束。
  • 值得添加的一件事 - 您不能直接在 ON CONFLICT ON CONSTRAINT 中引用唯一索引,但您可以引用条件(例如 ON CONFLICT (LOWER(first_name), LOWER(last_name) ). 今天把我绊倒了,这是这个问题在谷歌上的第一个结果,所以我想我会提到它......
【解决方案2】:
  • 1 是可能的,并给出重复错误。
  • 2 是不可能的。 (函数在约束中是不可能的)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-11
    • 2020-12-25
    • 1970-01-01
    • 2013-05-30
    • 2012-03-17
    • 2020-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多