如何正确创建相互引用的表?

时间:2019-07-07 21:26:47

标签: sql postgresql create-table

表“用户”取决于“公司”,“职位”和“雇员”:

create table companies(id serial primary key,
"name" varchar,
"comment" varchar,
lastmodified_datetime timestampz default now());

create table positions(id serial primary key,
"name" varchar,
"comment" varchar,
lastmodified_datetime timestampz default now());

create table employees(id serial primary key,
"name" varchar,
"comment" varchar,
firstname varchar,
middlename varchar,
lastname varchar,
isoffice boolean default true,
"position" integer references positions(id),
lastmodified_datetime timestampz default now());

create table users(id serial primary key,
"name" varchar,
"comment" varchar,
"login" varchar not null,
"password" varchar not null,
isadministrator boolean,
company integer references companies(id),
employee integer references employees(id),
lastlogged_datetime timestampz default now(),
lastmodified_datetime timestampz default now());

每行都有一个“ lastmodified_datetime”列来存储时间,但我也想存储有关用户的信息(添加lastmodified_user integer references users(id)列)。

当要创建基本表时我需要一个已经存在的“用户”表,但是为了创建“用户”表时,我需要基本表,这会造成一种情况。我还读过in this SO question,认为循环引用会导致设计错误。

如何在PostgreSQL上下文中正确实现它? 当我尝试创建引用另一个尚不存在的表的表时,PostgreSQL会中止逻辑查询。我应该先创建所有表,然后再对其进行更改以包括这些引用,还是有其他方法?

1 个答案:

答案 0 :(得分:0)

我认为这不是问题,因为companyemployee列可以为空。因此,您可以插入一个允许修改其他用户的用户。

同样,您可以使用last_modified_by_user(我认为该名称更具描述性),并在创建记录时将其保留为NULL。修改将仅用于对记录的更改,而不是原始记录。

如果您尝试将这些列设置为NOT NULL,则会遇到问题。