多个表之间的共同序列

KSl*_*oan 2 postgresql sequence

我正在尝试创建一个由多个表拥有的序列,以便在更多表上拥有唯一标识符.我可以考虑正确知道的唯一解决方法是在INSERTing时使用nextval(blabla_id_seq),但显然在使用COPY时(或者我现在无法想到的其他一些情况)它不会工作.
所以任何人都知道解决方案或其他解决方法吗?问题的目的主要是教育.

干杯,唐

LE我可以为两个(或更多)表,父和子实现全局主键吗?目前我试过了




DROP TABLE IF EXISTS child;
DROP TABLE IF EXISTS parent;

CREATE TABLE parent (
id serial PRIMARY KEY
, categ varchar(20) NOT NULL

);

CREATE TABLE child (
else varchar (30) NOT NULL
, id integer -- i have also tried with no id in child table, on;y when using   
--"id serial" does id become primary key
, CONSTRAINT PK__child PRIMARY KEY (id)

) INHERITS (parent);

COPY parent (categ)
FROM 'E:\\1\\_parent.csv'
WITH CSV;

COPY child(categ,altceva)
FROM  'E:\\1\\_child.csv'
WITH CSV;

INSERT INTO child (id,categ,altceva)
--VALUES(nextval('parent_id_seq')+3,'kid7','blabla');
VALUES(5,'kid7','blabla');


Run Code Online (Sandbox Code Playgroud)

但我可以插入重复

Sup*_*upr 6

这个问题很古老,但这里只是一个简单的答案.

这看起来像某种继承模型,我脑海中的自然解决方案是使用公共基表.基表至少包含一个串行列.可选地,它可以包含对于系统中的所有对象/节点通用的属性的字段.

node(serial node_id, timestamp creation_time default now())

book(integer node_id [foreign key => node.node_id], string title, timestamp published_time)
user(integer node_id [foreign key => node.node_id], string name, timestamp joined_time, string display_name)
car (integer node_id [foreign key => node.node_id], string model, timestamp manufactured_time, real miles)
Run Code Online (Sandbox Code Playgroud)

如果要添加新对象,或者node按原样添加新对象,则首先插入node然后使用返回的自动生成的序列id将更多详细信息插入到子类型表中.

这不需要任何特殊考虑因素,如事务,检查,触发器等,也不会因为唯一性错误而导致创建失败.

作为扩展,您可以string typenode表中添加字段并获得接受任何字段node_id并直接查找相应对象的能力.