无法在 ORACLE 中启用外键 SQL
Can't enable a foreign key in ORACLE SQL
所以我有一个禁用的外键(table 员工中的Manager_ID)并且我想启用它,但是我得到这个错误:
ORA-02298: cannot validate (my_username.EMP_MANAGER_FK) - parent keys not found
这是代码:
ALTER TABLE Employees ENABLE CONSTRAINT EMP_MANAGER_FK;
table 的创建方式如下:
CREATE TABLE "EMPLOYEES"
( "EMPLOYEE_ID" NUMBER(6,0),
"FIRST_NAME" VARCHAR2(20),
"LAST_NAME" VARCHAR2(25) CONSTRAINT "EMP_LAST_NAME_NN" NOT NULL ENABLE,
"EMAIL" VARCHAR2(25) CONSTRAINT "EMP_EMAIL_NN" NOT NULL ENABLE,
"PHONE_NUMBER" VARCHAR2(20),
"HIRE_DATE" DATE CONSTRAINT "EMP_HIRE_DATE_NN" NOT NULL ENABLE,
"JOB_ID" VARCHAR2(10) CONSTRAINT "EMP_JOB_NN" NOT NULL ENABLE,
"SALARY" NUMBER(8,2),
"COMMISSION_PCT" NUMBER(2,2),
"MANAGER_ID" NUMBER(6,0),
"DEPARTMENT_ID" NUMBER(4,0),
"BONUS" VARCHAR2(5),
CONSTRAINT "EMP_SALARY_MIN" CHECK (salary > 0) ENABLE,
CONSTRAINT "EMP_ID_PK" PRIMARY KEY ("EMPLOYEE_ID")
USING INDEX ENABLE,
CONSTRAINT "EMP_EMAIL_UK" UNIQUE ("EMAIL")
USING INDEX ENABLE
)
/
ALTER TABLE "EMPLOYEES" ADD CONSTRAINT "EMP_DEPT_FK" FOREIGN KEY
("DEPARTMENT_ID")
REFERENCES "DEPARTMENTS" ("DEPARTMENT_ID") ENABLE
/
ALTER TABLE "EMPLOYEES" ADD CONSTRAINT "EMP_JOB_FK" FOREIGN KEY ("JOB_ID")
REFERENCES "JOBS" ("JOB_ID") ENABLE
/
ALTER TABLE "EMPLOYEES" ADD CONSTRAINT "EMP_MANAGER_FK" FOREIGN KEY ("MANAGER_ID")
REFERENCES "EMPLOYEES" ("EMPLOYEE_ID") DISABLE
/
CREATE INDEX "EMP_DEPARTMENT_IX" ON "EMPLOYEES" ("DEPARTMENT_ID")
/
CREATE INDEX "EMP_JOB_IX" ON "EMPLOYEES" ("JOB_ID")
/
CREATE INDEX "EMP_MANAGER_IX" ON "EMPLOYEES" ("MANAGER_ID")
/
CREATE INDEX "EMP_NAME_IX" ON "EMPLOYEES" ("LAST_NAME", "FIRST_NAME")
/
从外键的角度来看,列中的值无效。
假设您有一个 self-referencing 外键,例如:
create table employees (
employee_id int primary key,
manager_id int references employees(employee_id)
);
然后报错提示有manager_id
在employee_id
列中不存在。您可以使用如下查询显示有问题的行:
select manager_id
from employees e
where not exists (select 1 from employees e1 where e1.employee_id = e.manager_id)
您需要解决这个问题才能启用外键。
如果你想以任何方式插入数据,你可以禁用约束 EMP_MANAGER_FK 并使用 NOVALIDATE 关键字启用它。
ALTER TABLE EMPLOYEES MODIFY CONSTRAINT EMP_MANAGER_FK ENABLE NOVALIDATE;
ENABLE NOVALIDATE 表示检查新行或修改行的约束,但现有数据可能违反约束。
所以我有一个禁用的外键(table 员工中的Manager_ID)并且我想启用它,但是我得到这个错误:
ORA-02298: cannot validate (my_username.EMP_MANAGER_FK) - parent keys not found
这是代码:
ALTER TABLE Employees ENABLE CONSTRAINT EMP_MANAGER_FK;
table 的创建方式如下:
CREATE TABLE "EMPLOYEES"
( "EMPLOYEE_ID" NUMBER(6,0),
"FIRST_NAME" VARCHAR2(20),
"LAST_NAME" VARCHAR2(25) CONSTRAINT "EMP_LAST_NAME_NN" NOT NULL ENABLE,
"EMAIL" VARCHAR2(25) CONSTRAINT "EMP_EMAIL_NN" NOT NULL ENABLE,
"PHONE_NUMBER" VARCHAR2(20),
"HIRE_DATE" DATE CONSTRAINT "EMP_HIRE_DATE_NN" NOT NULL ENABLE,
"JOB_ID" VARCHAR2(10) CONSTRAINT "EMP_JOB_NN" NOT NULL ENABLE,
"SALARY" NUMBER(8,2),
"COMMISSION_PCT" NUMBER(2,2),
"MANAGER_ID" NUMBER(6,0),
"DEPARTMENT_ID" NUMBER(4,0),
"BONUS" VARCHAR2(5),
CONSTRAINT "EMP_SALARY_MIN" CHECK (salary > 0) ENABLE,
CONSTRAINT "EMP_ID_PK" PRIMARY KEY ("EMPLOYEE_ID")
USING INDEX ENABLE,
CONSTRAINT "EMP_EMAIL_UK" UNIQUE ("EMAIL")
USING INDEX ENABLE
)
/
ALTER TABLE "EMPLOYEES" ADD CONSTRAINT "EMP_DEPT_FK" FOREIGN KEY
("DEPARTMENT_ID")
REFERENCES "DEPARTMENTS" ("DEPARTMENT_ID") ENABLE
/
ALTER TABLE "EMPLOYEES" ADD CONSTRAINT "EMP_JOB_FK" FOREIGN KEY ("JOB_ID")
REFERENCES "JOBS" ("JOB_ID") ENABLE
/
ALTER TABLE "EMPLOYEES" ADD CONSTRAINT "EMP_MANAGER_FK" FOREIGN KEY ("MANAGER_ID")
REFERENCES "EMPLOYEES" ("EMPLOYEE_ID") DISABLE
/
CREATE INDEX "EMP_DEPARTMENT_IX" ON "EMPLOYEES" ("DEPARTMENT_ID")
/
CREATE INDEX "EMP_JOB_IX" ON "EMPLOYEES" ("JOB_ID")
/
CREATE INDEX "EMP_MANAGER_IX" ON "EMPLOYEES" ("MANAGER_ID")
/
CREATE INDEX "EMP_NAME_IX" ON "EMPLOYEES" ("LAST_NAME", "FIRST_NAME")
/
从外键的角度来看,列中的值无效。
假设您有一个 self-referencing 外键,例如:
create table employees (
employee_id int primary key,
manager_id int references employees(employee_id)
);
然后报错提示有manager_id
在employee_id
列中不存在。您可以使用如下查询显示有问题的行:
select manager_id
from employees e
where not exists (select 1 from employees e1 where e1.employee_id = e.manager_id)
您需要解决这个问题才能启用外键。
如果你想以任何方式插入数据,你可以禁用约束 EMP_MANAGER_FK 并使用 NOVALIDATE 关键字启用它。
ALTER TABLE EMPLOYEES MODIFY CONSTRAINT EMP_MANAGER_FK ENABLE NOVALIDATE;
ENABLE NOVALIDATE 表示检查新行或修改行的约束,但现有数据可能违反约束。