【问题标题】:How to correctly create tables that reference each other?如何正确创建相互引用的表?
【发布时间】:2019-07-07 21:26:47
【问题描述】:

表“用户”取决于“公司”、“职位”和“员工”:

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 会中止符合逻辑的查询。我应该先创建所有表,然后更改它们以包含这些引用还是有其他方法?

【问题讨论】:

    标签: sql postgresql create-table


    【解决方案1】:

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

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

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

    【讨论】:

    • 我想我没有问这个问题本身。我已对其进行了修改:“当我尝试创建一个引用另一个尚不存在的表的表时,PostgreSQL 会中止符合逻辑的查询。我应该先创建所有表,然后再更改它们以包含这些引用,还是有另一个表?方法?”
    • 是的,你应该这样做。
    • @CorellianAle 。 . .您需要使用alter table 为自引用表添加一些约束。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-26
    • 1970-01-01
    • 1970-01-01
    • 2017-04-13
    • 2021-01-25
    • 1970-01-01
    相关资源
    最近更新 更多