没有序列和触发器就没有简单的方法吗?我有一般的SQL技能,我想使用pl/sql(PostgreSQL)的行业标准方法。我基本上是从Spring Security转换此示例表:
create table group_members (
id bigint generated by default as identity(start with 0) primary key,
username varchar(50) not null,
group_id bigint not null,
constraint fk_group_members_group foreign key(group_id) references groups(id));
到目前为止,我拥有的:
CREATE TABLE auth_group_members (
id NUMBER,
username VARCHAR(50) NOT NULL,
group_id NUMBER NOT NULL,
CONSTRAINT "FK_AuthGroupMembers" FOREIGN KEY(group_id) REFERENCES auth_groups(id)
);
标准方法是使用 serial
或 bigserial
:
数据类型 serial 和 bigserial 不是真正的类型,而只是创建唯一标识符列的符号便利(类似于其他一些数据库支持的 AUTO_INCREMENT 属性)。
[...]
因此,我们创建了一个整数列,并安排从序列生成器分配其默认值。
因此,您将使用如下所示的内容创建表:
CREATE TABLE auth_group_members (
id bigserial primary key,
username VARCHAR(50) NOT NULL,
group_id NUMBER NOT NULL,
CONSTRAINT "FK_AuthGroupMembers" FOREIGN KEY(group_id) REFERENCES auth_groups(id)
);
serial
和 bigserial
类型确实会在后台创建序列,但您永远不必直接使用该序列。
在 PostgreSQL 10 中可以使用 identity columns
。下面是示例:
create table group_members (
id bigint generated by default as identity(start with 1) primary key,
username varchar(50) not null,
group_id bigint not null
);
此外:
- 关于标识列与串行的好文章。
- PostgreSQL 文档以获取更多信息(Ctrl+F 并搜索"AS IDENTITY")。