无法将数据输入到有相互关联的外键的表中。

问题描述 投票:0回答:1

我用下面的代码创建了表,但外键约束不允许添加数据。我该怎么做才能解决这个问题?

CREATE TABLE Employee(
Ssn VARCHAR(10) PRIMARY KEY NOT NULL,
BDate DATE,
FName VARCHAR(25),
MInit VARCHAR(5),
LName VARCHAR(25),
Address VARCHAR(40),
Sex VARCHAR(6),
Salary INT,
SupervisorSsn VARCHAR(10),
DNumber INT
);
CREATE TABLE

CREATE TABLE Department(
DNumber INT PRIMARY KEY NOT NULL,
DName VARCHAR(15),
MgrSsn VARCHAR(10),
MgrStartDate DATE,
NumberofEmployees INT,
CONSTRAINT Department_MgrSsn_FK FOREIGN KEY(MgrSsn) REFERENCES Employee(Ssn) ON DELETE SET DEFAULT ON UPDATE CASCADE
);

ALTER TABLE Employee
ADD CONSTRAINT Employee_SupervisorSsn_FK FOREIGN KEY(SupervisorSsn) REFERENCES Employee(Ssn) ON DELETE SET DEFAULT ON UPDATE CASCADE,
ADD CONSTRAINT Employee_DNumber_FK FOREIGN KEY(DNumber) REFERENCES Department(DNumber) ON DELETE SET DEFAULT ON UPDATE CASCADE;
postgresql foreign-keys sql-insert
1个回答
0
投票

在Postgres中有几种方法。

稍后更新

最明显的一个:插入 null 值,然后再更新。

insert into department 
  (dnumber, dname)
values 
  (1, 'One'),
  (2, 'Two'),
  (3, 'Three');

insert into employee (ssn, fname, lname, supervisorssn, dnumber)
values 
  ('123', 'Arthur', 'Dent', '456', 1),
  ('456', 'Ford', 'Prefect', null, 2),
  ('789', 'Zaphod', 'Beeblebrox', null, 3);

update department
  set mgrssn = '456'
where dnumber in (1,2);

update department
  set mgrssn = '789'
where dnumber = 3;

在线示例

推迟的制约因素

使约束条件延迟,这样它们将在事务结束时被检查,而不是在运行INSERT时。

ALTER TABLE department
  add constraint fk_dempt2emp foreign key (mgrssn) references employee
  deferrable initially deferred; --<<

然后你可以按照你喜欢的任何顺序插入行,只要所有的事情都发生在一个事务中。

begin transaction; --<< important!

insert into department 
  (dnumber, dname, mgrssn)
values 
  (1, 'One', '456'),
  (2, 'Two', '456'),
  (3, 'Three', '789')

insert into employee (ssn, fname, lname, supervisorssn, dnumber)
values 
  ('123', 'Arthur', 'Dent', '456', 1),
  ('456', 'Ford', 'Prefect', null, 2),
  ('789', 'Zaphod', 'Beeblebrox', null, 3);

commit; -- the FKs will be checked here

在一个语句中完成所有的事情

您可以使用 数据修改CTE 将行插入到两个表中。由于这是以单条语句的形式来评估的,所以约束条件不需要是可递延的。

with new_depts as (
  insert into department 
    (dnumber, dname, mgrssn)
  values 
    (1, 'One', '456'),
    (2, 'Two', '456'),
    (3, 'Three', '789')
)
insert into employee (ssn, fname, lname, supervisorssn, dnumber)
values 
  ('123', 'Arthur', 'Dent', '456', 1),
  ('456', 'Ford', 'Prefect', null, 2),
  ('789', 'Zaphod', 'Beeblebrox', null, 3)
;

在线示例

© www.soinside.com 2019 - 2024. All rights reserved.