PostgreSQL - 继承表中常见的自增列

3
我目前正在尝试使用PostgreSQL的继承系统,但在我的子表中有一个自动增量索引的问题。
我有三个表:"Currency"、"Crypto"和"Stable"。
CREATE TABLE IF NOT EXISTS public.currency
(
    id INT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
    name VARCHAR(30) UNIQUE NOT NULL,
    symbol VARCHAR(10) UNIQUE NOT NULL,
);

CREATE TABLE IF NOT EXISTS public.stable (id INT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY) INHERITS (public.currency);    
CREATE TABLE IF NOT EXISTS public.crypto (id INT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY) INHERITS (public.currency);

我是这样插入数据的:
INSERT INTO public.stable (name, symbol) VALUES ('Euro', '€'), ('Dollar', '$'), ('Tether', 'USDT');    
INSERT INTO public.crypto (name, symbol) VALUES ('Bitcoin', 'BTC'), ('Ethereum', 'ETH'), ('Litcoin', 'LTC');

但这是我的问题:我想要一个唯一的标识符,它通过我的父表“Currency”自增。 当我选择时,我会得到(看看我的ID:1、2、3、1、2、3):

enter image description here

但是,有没有可能改成这样(1、2、3、4、5、6):

enter image description here

这是一个关于我的主键(primary key)是否有问题的问题。谢谢。
1个回答

2
我们可以尝试使用创建序列为多个表之间共享设置行号。

定义一个新的序列生成器

create sequence n_id;

然后我们可以像下面这样使用这个序列,将这个序列共享给这三个表。

create sequence n_id;

CREATE TABLE IF NOT EXISTS currency
(
    id INT default nextval('n_id') PRIMARY KEY,
    name VARCHAR(30) UNIQUE NOT NULL,
    symbol VARCHAR(10) UNIQUE NOT NULL
);

CREATE TABLE IF NOT EXISTS stable (id INT default nextval('n_id') PRIMARY KEY) INHERITS (currency);    
CREATE TABLE IF NOT EXISTS crypto (id INT default nextval('n_id') PRIMARY KEY) INHERITS (currency);

{{链接1:sqlfiddle}}


太酷了,谢谢!但这是唯一的方法吗?我的意思是,我有另一个父表和4个子表。我是否也需要创建一个序列?或者这是“共享”自动增量的唯一方法? - Naografix
根据我的经验,可以创建一个“序列”对象,为多个表共享相同的增量ID。 - D-Shih

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接