微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

表模式中的鸡或蛋问题 [PostgreSQL] 如何INSERT?

如何解决表模式中的鸡或蛋问题 [PostgreSQL] 如何INSERT?

如何在 Postgresql 中创建行并将行插入到下表模式中:

表:employee

emp_id,emp_name,emp_dept,emp_manager

表:department

dept_id,dept_name,dept_manager

emp_manageremployee(emp_id)

的外键

emp_deptdepartment(dept_id)

的外键

dept_manageremployee(emp_id)

的外键

解决方法

它可以这样工作:

CREATE TABLE employee (
  emp_id int PRIMARY KEY,emp_dept int NOT NULL,emp_manager int,emp_name text NOT NULL,CONSTRAINT fk_emp_manager FOREIGN KEY (emp_manager) REFERENCES employee(emp_id),UNIQUE (emp_dept,emp_id)  -- needed for FK fk_dept_manager
);

CREATE TABLE department (
  dept_id int PRIMARY KEY,dept_manager int,dept_name text NOT NULL,CONSTRAINT fk_dept_manager FOREIGN KEY (dept_id,dept_manager) REFERENCES employee(emp_dept,emp_id)
);

ALTER TABLE employee
  ADD CONSTRAINT fk_emp_dept
  FOREIGN KEY (emp_dept) REFERENCES department(dept_id);

请注意我如何将 fk_dept_manager 更改为多列 FK 引用以仅允许同一部门的员工担任部门经理。假设你想要那个。

您可能还希望表 CHECK 中的 employee 约束禁止员工成为他们自己的经理:

CHECK (emp_manager <> emp_id)

如何INSERT

像往常一样。为了克服相互依赖,要么使 FK 约束 DEFERRABLE 并在单个事务中运行多个命令(成本更高),要么使用具有一个或多个 CTE 的单个命令。

示例:同时插入一个新部门和一个新员工作为其经理:

WITH ins_dept AS (
   INSERT INTO department
          (dept_manager,dept_name)          
   VALUES (nextval(pg_get_serial_sequence('employee','emp_id')),'Sales')
   RETURNING *
   )
INSERT INTO employee
      (emp_id,emp_dept,emp_manager,emp_name)
SELECT dept_manager,dept_id,NULL,'Bob'
FROM   ins_dept;

dbfiddle here

进一步阅读:

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。