我正在尝试创建一个由多个表拥有的序列,以便在更多表上拥有唯一标识符。我可以考虑正确知道的唯一解决方法是在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');
但我可以插入重复
答案 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
并直接找到相应的对象。