【问题标题】:create a unique constraint on table column on Existing Table with records在包含记录的现有表上的表列上创建唯一约束
【发布时间】:2015-08-11 16:07:51
【问题描述】:

是否可以在包含记录的现有表上的表列上创建唯一约束?

ALTER TABLE Persons ADD UNIQUE (P_Id)

如果表中有数据,而P_Id中的部分数据不是唯一的会怎样?

【问题讨论】:

  • 通过搜索 Oracles 在线文档可以很容易地回答这个问题。或者只是自己尝试一下,如果你需要的话,在虚拟桌子上。 What have you tried? 是一个常见问题,请不要让它成为Nothing? :(
  • 我没有安装 oracle 数据库。我尝试使用sqlfiddle.com 进行此操作,但出现了一些我认为与此无关的错误。
  • 向我们展示您在 SQL Fiddle 中的尝试,并解决您的问题。
  • 创建表人员(p_id VARCHAR(10)、城市 VARCHAR(10)、国家/地区 VARCHAR(10));插入人员(p_id,城市,国家)值(“一”,“二”,“三”);错误:ORA-00984:此处不允许列
  • 您不应该在值周围使用双引号:'one' 而不是 "one" 等。您不小心使用了带引号的标识符。不过,这与您提出的问题无关。 SQL Fiddle 也很有用,但如果您想学习 Oracle,最好使用自己的数据库。您可以获得预先构建的虚拟机来玩,这样您就不必担心安装。

标签: sql database oracle oracle11g ddl


【解决方案1】:

如果您尝试在没有唯一值的列上添加唯一键,那么您将收到 ORA: 错误。但是,您可以通过以下两种方式克服这一点。

方式 1:

ALTER TABLE TABLE_NAME ADD CONSTRAINT CONSTRAINT_NAME UNIQUE (FIELD_NAME) DEFERRABLE NOVALIDATE;

方式 2:

ALTER TABLE TABLE_NAME ADD CONSTRAINT CONSTRIANT_NAME UNIQUE (FIELD_NAME) DISABLE;

ALTER TABLE TABLE_NAME ENABLE NOVALIDATE CONSTRAINT CONSTRAINT_NAME;

在第一种方式中,我们明确提到 Oracle 在创建 UNIQUE 键时不验证现有数据,在第二种方式中,我们最初将 UNIQUE 键标记为禁用(如果我们将其标记为禁用,它将不会验证数据) 然后使用 NOVALIDATE 关键字启用它

【讨论】:

  • 仅当约束支持by a non-unique index。如果索引是唯一的(这是您默认获得的),那么它仍然会出错。
  • @AlexPoole 感谢您指出这一点,但我不确定我们是否可以在具有重复数据的列上创建唯一索引。
  • 不,你不能,如果你创建一个基本的唯一约束,一个唯一索引将被自动创建——所以如果存在重复值,它将失败。您可以将现有索引指定为约束定义的一部分,通常是唯一的索引 - 例如删除和重新创建约束,而无需重新构建索引。但它不一定是唯一的,正如 Jon 在我链接到的答案中所显示的那样。
  • 是的,如果没有在应用了唯一约束的列上创建唯一/非唯一索引,那么 Oracle 将自动为该列创建唯一索引
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-26
  • 2012-01-04
  • 1970-01-01
  • 2011-02-11
  • 2013-01-18
相关资源
最近更新 更多