多个表之间的共同序列

时间:2011-09-07 20:26:24

标签: 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');


但我可以插入重复

1 个答案:

答案 0 :(得分: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)

如果要添加新对象或node,请首先插入node,然后使用返回的自动生成的序列id将更多详细信息插入到亚型表。

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

作为扩展程序,您可以向string type表添加node字段,并且可以接受任何node_id并直接找到相应的对象。