Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 交叉外键Postgresql_Database_Postgresql_Foreign Keys_Primary Key - Fatal编程技术网

Database 交叉外键Postgresql

Database 交叉外键Postgresql,database,postgresql,foreign-keys,primary-key,Database,Postgresql,Foreign Keys,Primary Key,我需要创建两个表,例如: Id\u faculty\u reference和Id\u professor是主键(有效) Id\u dean是一个外键,与Id\u professor Id\u faculty是一个外键,指向Id\u faculty\u reference(问题) 我试过这个: CREATE TABLE Faculty( Id_faculty_reference int PRIMARY KEY, faculty_name varchar,

我需要创建两个表,例如:

  • Id\u faculty\u reference
    Id\u professor
    是主键(有效)

  • Id\u dean
    是一个外键,与
    Id\u professor

  • Id\u faculty
    是一个外键,指向
    Id\u faculty\u reference
    (问题)

我试过这个:

CREATE TABLE Faculty(
      Id_faculty_reference int PRIMARY KEY,
      faculty_name varchar,
      Id_dean int
);

CREATE TABLE Professors(
      Id_professor int PRIMARY KEY,
      Name varchar,
      Last_name varchar,
      Salary int,
      Id_faculty int REFERENCES Faculty(id_faculty_reference)
);

ALTER TABLE Faculty ADD FOREIGN KEY (Id_dean)
   REFERENCES Professors(id_professor);
当我尝试向表中添加信息时,问题就出现了。如果我试图将信息添加到
教员
,则没有参考,因为
教授
为空:

键不在表“Professors”中
如果我试图将信息添加到
教授
,则没有参考,因为教员是空的:

键不在表“Faculty”中

这个错误对我来说是有道理的,但我的教授说他所要求的是可以做到的;我如何才能做到这一点?

有三种方法:

  • 首先插入一个
    faculty
    ,其中
    id\u dean
    为空。然后插入引用该
    教员
    条目的
    教授
    。然后更新第一个条目以指向第二个条目

    这是因为
    id\u dean
    可以为NULL,并且不强制执行设置为NULL的外键

    一般来说,最好尽可能多的列
    notnull
    。在这种情况下,请使用其他方法之一

  • 在语句末尾检查外键,因此在单个语句中插入两行:

    WITH newfac AS (
       INSERT INTO faculty (...) VALUES (...)
       RETURNING id
    )
    INSERT INTO professors (id_faculty, ...)
    SELECT newfac.id, ...
    FROM newfac;
    
  • 使用延迟外键约束:

    CREATE TABLE faculty(
       ...,
       id_dean int REFERENCES professors DEFERRABLE INITIALLY DEFERRED
    );
    
    这样的外键约束不会在语句末尾检查,而是在事务末尾检查。因此,您可以首先输入
    教员
    ,然后输入
    教授
    ,只要您在单个数据库事务中输入即可