在不知道约束名的情况下,如何删除表列上的唯一约束

5
在Oracle 10g中,如果我不知道唯一约束的名称(例如系统生成的名称,在数据库实例之间可能不同),如何删除列上的唯一约束?删除并重新创建表不是一个选项。有没有可能做到这一点?
1个回答

9
您可以使用以下代码获取约束的名称:
SELECT CONSTRAINT_NAME
FROM USER_CONSTRAINTS WHERE TABLE_NAME = 'xxx'
AND CONSTRAINT_TYPE = 'U'

例如,您可以创建一个存储过程来执行先前的 SQL,将其结果存储在变量中,并在 ALTER TABLE DROP CONSTRAINT 中使用该变量。

编辑:

BEGIN
  FOR r IN (
    SELECT TABLE_NAME, CONSTRAINT_NAME
    FROM USER_CONSTRAINTS WHERE TABLE_NAME = 'xxx'
    AND CONSTRAINT_TYPE = 'U') LOOP
    EXECUTE IMMEDIATE REPLACE(REPLACE(
      'ALTER TABLE #TABLE# DROP CONSTRAINT #CON#'
      ,'#TABLE#',r.TABLE_NAME)
      ,'#CON#',r.CONSTRAINT_NAME);
  END LOOP;
END;

谢谢,这对我的目的很有效。尽管我可以看到在某些情况下需要特别小心,比如当您想保留一些唯一约束并删除其他约束时,因为您不能简单地聚焦于涉及约束的特定列。 - Stephen Swensen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接