Oracle 11g - 查询错误

时间:2016-04-21 12:48:28

标签: sql oracle oracle11g

我有这个oracle查询,它在一个环境中运行良好,并在其他环境中给出错误。两种环境都有完全相似的数据库。

DECLARE
  v_temp NUMBER(1,0) := 0;
  BEGIN
  BEGIN
    SELECT 1 INTO v_temp FROM USER_CONSTRAINTS WHERE CONSTRAINT_NAME = 'FK_PDUCRC_MtrPrgAssc';        
    EXCEPTION WHEN NO_DATA_FOUND THEN v_temp := 0;
END;

IF v_temp = 0 THEN
    BEGIN
        EXECUTE IMMEDIATE 'ALTER TABLE METERCONFIGPDUCRC
                            ADD CONSTRAINT FK_PDUCRC_MtrPrgAssc
                            FOREIGN KEY (MeterProgramAssocID)
                            REFERENCES MeterProgramAssoc(MeterProgramAssocID)';
    END;
END IF;
END;

错误是 -

  

这种参照约束已存在于表中。

请帮我解决这个问题。

3 个答案:

答案 0 :(得分:0)

假设您不想创建具有相同名称但不同大小写的约束,您可以尝试检查是否存在约束处理大写/小写:

DECLARE
  v_temp NUMBER(1,0) := 0;
  BEGIN
    BEGIN
      SELECT 1 INTO v_temp FROM USER_CONSTRAINTS WHERE upper(CONSTRAINT_NAME) = upper('FK_PDUCRC_MtrPrgAssc');        
      EXCEPTION
        WHEN NO_DATA_FOUND
          THEN v_temp := 0;
    END;

  IF v_temp = 0 THEN
    BEGIN
        EXECUTE IMMEDIATE 'ALTER TABLE METERCONFIGPDUCRC
                            ADD CONSTRAINT FK_PDUCRC_MtrPrgAssc
                            FOREIGN KEY (MeterProgramAssocID)
                            REFERENCES MeterProgramAssoc(MeterProgramAssocID)';
    END;
  END IF;
END;

答案 1 :(得分:0)

错误消息对我没有听起来像约束NAME是问题。该错误并未表示同名的约束已存在;它表示此表中已存在引用约束。

运行DESCRIBE METERCONFIGPDUCRC并查看您是否已尝试向其添加FK约束的列上有外键约束。 (DESCRIBE是一个sqlplus命令,SQL Developer和Toad可以理解它;使用你的界面中可能有的任何等效工具。)

答案 2 :(得分:0)

似乎MeterProgramAssocID已经成为一个外键,引用了具有不同约束名称的MeterProgramAssoc(MeterProgramAssocID)。检查这种约束是否已经存在。

SELECT A.CONSTRAINT_NAME来自USER_CONSTRAINTS A,USER_CONS_COLUMNS B WHERE A.CONSTRAINT_TYPE =' R' AND A.TABLE_NAME =' METERCONFIGPDUCRC' AND A.OWNER = AND A.OWNER = B.OWNER AND A.CONSTRAINT_NAME = B.CONSTRAINT_NAME AND A.TABLE_NAME = B.TABLE_NAME AND B.COLUMN_NAME = UPPER(' MeterProgramAssocID')

上面的查询应该为您提供现有的约束名称。希望这会有所帮助。