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

时间:2010-10-15 17:56:17

标签: sql oracle10g unique-constraint

在Oracle 10g中,如何在不知道约束名称的情况下删除列上的唯一约束(例如,系统生成的名称,在数据库实例之间不一定相同)?删除并重新创建表不是一种选择。有可能吗?

1 个答案:

答案 0 :(得分:8)

您可以使用以下方法检索约束的名称:

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;