如何使一个表与Postgresql中的另一个表共享序列?

时间:2018-10-29 09:50:38

标签: sql postgresql

基本上,我有一个带有城市唯一特征ID的表1,现在我得到了那个国家/地区特征的table2。

我需要为国家/地区表创建新的ID(它们需要与城市共享相同的序列,以便在交叉引用表时ID匹配)

如何在城市中使table2具有与table1相同的ID,然后为其他地方的特征提供新的ID?本质上共享序列

编辑:表已经创建,如何更新表2

4 个答案:

答案 0 :(得分:2)

如果您手动创建一个序列并将其作为默认值分配给ID列,那么它将起作用。但是要重用现有值,这意味着我们必须创建一个触发器来分配现有值或从共享序列中获取新值。

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

还有一个奖励:

drop sequence 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

答案 1 :(得分:1)

这听起来好像不是很好(甚至可能)的数据库设计。相反,我建议创建一个连接表,将城市与各自国家联系起来。因此,您的三个表可能如下所示:

city (PK id, name, ...)
country (PK id, name, ...)
country_city (city_id, country_id)  PK (city_id -> city(id), country_id -> country(id))

采用这种设计,您不必担心citycountry表中的自动递增序列。只需让Postgres分配这些值,然后使用正确的值维护联结表即可。

答案 2 :(得分:1)

<button onclick="color()">Color</button>
<button onclick="btn('para')">Show/Hide</button>
<p class="color" id="para">Example 1</p>

<button onclick="btn('para2')">Show/Hide</button>
<p class="color" id="para2">Example 2</p>

答案 3 :(得分:1)

如果已经创建了表,则必须创建一个序列

create sequence seq_city_country;

,然后使用以下代码将该序列添加到您的ID中

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');

如果(sequence_c)已经为表格城市创建了序列,则可以使用

  ALTER TABLE country ALTER COLUMN id_country SET DEFAULT nextval('sequence_c');