PostgreSQL是否支持“可选的”、可为空的外键?

6

我有一个可能很愚蠢的问题,甚至不知道我是否正在尝试正确解决它,但是这就是问题所在。

我有一个部门,有几个员工,员工可以被分配到一个部门,但不一定必须属于某个部门。我考虑使用员工表中的部门编号作为外键,但是那些没有所属部门的员工怎么办? 我能否只插入fk列中的null值?但是我想知道是否有效,因为我只能插入已存在于引用列中的值。

以下是相关代码:

CREATE TABLE department(depno int unique not null,
                        primary key(depno));

CREATE TABLE employee(ID int unique not null, name not null,
                      depno int,
                      primary key(ID))
                      foreign key(depno)
                      references department(depno)

我希望这个问题还没有被回答过一百次,而我在过去的两个小时里一直找不到答案。但是我似乎找不到关于这是否应该工作的任何信息。

非常感谢任何提示或解决方案!

1个回答

8

这是postgresql中的操作方法:

SQL DEMO

CREATE TABLE department(depno int PRIMARY KEY);

CREATE TABLE employee(ID int PRIMARY KEY,
                      name text not null,
                      depno int references department(depno)
                      );


INSERT INTO department  VALUES (1);
INSERT INTO department  VALUES (2);

INSERT INTO employee  VALUES (1, 'Jhon Doe', null); -- INSERT OK
INSERT INTO employee  VALUES (2, 'Jane Doe', 3);    -- VIOLATE FK

SELECT * FROM employee;

输出

enter image description here


顺便说一句:(depno int unique not null, primary key(depno)是多余的,根据定义,主键是not nullunique的,只需要depno int primary key就足够了。 - krokodilko
@krokodilko 你说得对,我修复了员工表但没有检查部门表。此外,你可以在声明字段的同一行引用外键。 - Juan Carlos Oropeza
另外,您应该为您的 PK 使用“SERIAL”类型,并让 PostgreSQL 处理 ID。 - Juan Carlos Oropeza

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接