如何正确创建相互引用的表?
How to correctly create tables that reference each other?
Table "users" 取决于 "companies"、"positions" 和 "employees":
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)
列)。
这会造成一种情况,为了创建基本的 table,我需要一个已经存在的 "users" table,但为了创建 "users" tables,我需要基本的 tables。我还读到 in this SO question 循环引用会导致糟糕的设计。
如何在PostgreSQL 上下文中正确实现它?
当我尝试创建一个 table 引用另一个尚不存在的 table 时,PostgreSQL 中止了符合逻辑的查询。我应该先创建所有 table 然后更改它们以包含这些引用还是有其他方法?
我认为这不是问题,因为 company
和 employee
列是 null-able。因此,您可以插入一个用户,然后允许修改其他用户。
以类似的方式,您可以使用 last_modified_by_user
(我认为该名称更具描述性)并在创建记录时将其保留 NULL
。然后,修改将仅用于 更改 记录,而不是原始记录。
如果您尝试创建这些列,您将遇到问题 NOT NULL
。
Table "users" 取决于 "companies"、"positions" 和 "employees":
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)
列)。
这会造成一种情况,为了创建基本的 table,我需要一个已经存在的 "users" table,但为了创建 "users" tables,我需要基本的 tables。我还读到 in this SO question 循环引用会导致糟糕的设计。
如何在PostgreSQL 上下文中正确实现它? 当我尝试创建一个 table 引用另一个尚不存在的 table 时,PostgreSQL 中止了符合逻辑的查询。我应该先创建所有 table 然后更改它们以包含这些引用还是有其他方法?
我认为这不是问题,因为 company
和 employee
列是 null-able。因此,您可以插入一个用户,然后允许修改其他用户。
以类似的方式,您可以使用 last_modified_by_user
(我认为该名称更具描述性)并在创建记录时将其保留 NULL
。然后,修改将仅用于 更改 记录,而不是原始记录。
如果您尝试创建这些列,您将遇到问题 NOT NULL
。