【问题标题】:Multiple unique constraints on different columns in the same table同一表中不同列的多个唯一约束
【发布时间】:2019-02-15 15:44:23
【问题描述】:

我的Oracle 11g 数据库中有一个关键表。它有一个index column,设置为primary key。第二列包含必须唯一的字符串。我为那个添加了unique constraint。现在有第三列也应该有一个唯一的约束。

当我使用ALTER TABLE 语句时,我得到了错误

'ORA-02299: 发现重复键'错误。

我知道可以在多个列上创建唯一约束,但这不是我想要的。我需要列是独立唯一的:

    ALTER TABLE someTable
    ADD CONSTRAINT constraint1_someTable UNIQUE (column2);
    ALTER TABLE someTable
    ADD CONSTRAINT constraint2_someTable UNIQUE (column3);

我希望该表所有列中的所有条目都是完全唯一的。有没有一种优雅的方法来实现这一点?

【问题讨论】:

  • “我希望该表的所有列中的所有条目都是完全唯一的” - 但是您是否检查过现有数据的实际情况?该错误表明它不正确,因此您需要弄清楚如何解决重复项,除非您只想强制新条目的唯一性。

标签: sql oracle unique-constraint


【解决方案1】:

您的列似乎包含一些重复的键,因此当您尝试应用唯一索引时会出现错误。
在设置唯一约束之前检查您没有任何重复的值。

【讨论】:

    【解决方案2】:

    您必须先找到并消除列的重复值,然后才能对其添加唯一约束。

    您可以使用以下查询来查找重复值

    select column3 from someTable group by column3 having count(*) > 1;
    

    如果您无法消除重复值但希望防止出现新的重复值,则可以使用 非唯一 索引添加带有 NOVALIDATE 选项的唯一约束。

    ALTER TABLE someTable
     ADD CONSTRAINT constraint2_someTable UNIQUE (column3) 
       USING INDEX(CREATE INDEX column3_ix ON someTable (column3)) ENABLE NOVALIDATE;
    

    【讨论】:

      【解决方案3】:

      schurik 的解决方案应该有效。 另一种解决方案是自加入。

      select t1.column1, t1.column3, t2.column3
      from someTable t1, someTable t2
      where t1.column1 = t2.column1
      and t1.column3 = t2.column3
      and t1.rowid <> t2.rowid
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-10
        相关资源
        最近更新 更多