【问题标题】:Oracle 12c - I cannot modify constraint of column ORA-02275Oracle 12c - 我无法修改 ORA-02275 列的约束
【发布时间】:2017-06-25 07:25:18
【问题描述】:

我创建了一个表 ASSIGNMENTS:

CREATE TABLE assignments (
    id_project NUMBER(4) NOT NULL CONSTRAINT fk_assignments_01 REFERENCES projects (id_project),
    empl_number NUMBER(6) NOT NULL CONSTRAINT fk_assignments_02 REFERENCES employees (empl_id),
    start DATE DEFAULT SYSDATE,
    end DATE,
        CONSTRAINT chk_assignements_dates CHECK (end > start),
    rate NUMBER(7, 2),
        CONSTRAINT chk_assignements_rate CHECK (rate > 0),
    role VARCHAR2(20),
        CONSTRAINT chk_assignements_role CHECK (rola IN ('ANALYST', 'DEVELOPER'))
);

现在我必须修改约束 fk_assignments_02。我想将 fk_assignments_02 设置为 DELETE CASCADE。我尝试这样做:

ALTER TABLE assignments
    MODIFY id_project NUMBER(4) NOT NULL CONSTRAINT fk_assignments_01 REFERENCES projects (id_project) ON DELETE CASCADE;

但我得到一个错误: ORA-02275: 表中已存在此类引用约束

【问题讨论】:

  • 先删除约束,然后重新创建。
  • 我想知道如何修改它,我不想重新创建表。这不是一个解决方案,而是一个 hack。
  • 你能用那个语句创建表吗?我强烈怀疑。您有一个错字:在最后一个检查约束中,rola IN ... - 列的名称是 role,而不是 rolastart 是 Oracle 保留字,因此不能用作列名。有什么问题,COPY AND PASTE 在您的机器上损坏了吗?

标签: sql oracle oracle12c


【解决方案1】:

您不能这样做 - 您必须删除并重新添加约束。 Oracle 中没有更改 ON DELETE 操作的规定,它是 REFERENCES 子句的一部分,而不是约束状态的一部分。

所以要做到这一点,你需要这样做

ALTER TABLE ASSIGNMENTS DROP CONSTRAINT FK_ASSIGNMENTS_02;

紧随其后

ALTER TABLE ASSIGNMENTS
  ADD CONSTRAINT FK_ASSIGNMENTS_02
    FOREIGN KEY (ID_PROJECT) REFERENCES PROJECT (ID_PROJECT)
      ON DELETE CASCADE;

祝你好运。

【讨论】: