基本上我有一个表1,其中包含城市特征的唯一ID,现在我获得了一个表2,其中包含该国的特征。我需要为国家表创建新的ID(这些需要与城市共享相同的顺序,以便在交叉引用表时匹配ID)。如何使表2具有相同的ID,以匹配表1中的城市ID,并为其他地方的特征创建新的ID?实质上是共享序列。编辑:表已经创建好了,如何更新表2。
create sequence baz;
create table foo(id bigint default nextval('baz'), value text);
create table bar(id bigint default nextval('baz'), value date);
insert into foo (value) values ('Hello');
insert into bar (value) values (now());
insert into foo (value) values ('World');
insert into bar (value) values (now());
select 'foo', id, value::text from foo
union all
select 'bar', id, value::text from bar
结果是:
foo 1 Hello
bar 2 2018-10-29
foo 3 World
bar 4 2018-10-29
还有一个额外的奖励:
删除序列baz
ERROR: cannot drop sequence baz because other objects depend on it
Detail:
default for table foo column id depends on sequence baz
default for table bar column id depends on sequence baz
Hint: Use DROP ... CASCADE to drop the dependent objects too.
编辑:如果我们可以进行后处理,那么这种方法可以用来为缺失的ID列分配值:
update bar
SET id = coalesce((select id from foo where bar.city_name = foo.city_name),nextval('baz'))
WHERE id is null
如果您的表已经创建,那么您必须创建一个序列
create sequence seq_city_country;
ALTER TABLE city ALTER COLUMN id_city SET DEFAULT nextval('seq_city_country');
ALTER TABLE country ALTER COLUMN id_country SET DEFAULT nextval('seq_city_country');
ALTER TABLE country ALTER COLUMN id_country SET DEFAULT nextval('sequence_c');
CREATE SEQUENCE shared_seq;
CREATE TABLE a (
col1 bigint DEFAULT nextval('shared_seq'),
...
);
CREATE TABLE b (
col1 bigint DEFAULT nextval('shared_seq'),
...
);
city (PK id, name, ...)
country (PK id, name, ...)
country_city (city_id, country_id) PK (city_id -> city(id), country_id -> country(id))
city
和country
表中的自动增量序列。只需让Postgres分配这些值,然后使用正确的值维护连接表即可。city
和country
表的两个id
列将是自动递增序列。然后联接表的主键将是每个序列中的一个值的组合。 - Tim Biegeleisen