为啥 SERIAL 不能在 Postgres 中处理这个简单的表?

Posted

技术标签:

【中文标题】为啥 SERIAL 不能在 Postgres 中处理这个简单的表?【英文标题】:Why SERIAL is not working on this simple table in Postgres?为什么 SERIAL 不能在 Postgres 中处理这个简单的表? 【发布时间】:2016-08-29 09:28:51 【问题描述】:

我正在使用 Postgres 9.1。并且 auto_increment (串行)不起作用。我刚刚发现了关于“串行”的内容: https://www.postgresql.org/docs/current/static/datatype-numeric.html#DATATYPE-SERIAL

CREATE TYPE FAMILY AS(
    id int,
    name VARCHAR(35),
    img_address VARCHAR(150));

CREATE TABLE FAMILIES of FAMILY(
    id SERIAL primary key NOT NULL,
    name NOT NULL
    );

ERROR:  syntax error at or near "SERIAL"
LINE 7:  id SERIAL primary key NOT NULL,
                         ^


********** Error **********

ERROR: syntax error at or near "SERIAL"
SQL state: 42601

【问题讨论】:

你为什么首先使用TYPE?您要解决的实际问题是什么?为什么不直接使用create table families (id serial primary key, name varchar(35), img_address varchar(150)); 因为我正在使用 Java,我想在数据库中创建对象。 这与您如何在数据库中创建表完全无关。此外:如果你只是运行create table family (...),你将自动拥有一个名为family的类型 不,如果我创建表族,我有一个名为 family 的表及其列,仅此而已。如果我创建一个类型(就像在 Java 中创建一个类),我将拥有包含家庭对象的表,并且使用我拥有的代码对我来说更舒服。 是的,你有那张桌子。 具有该名称的类型(试试看)。您可能认为您的复杂方式使与 Java 的交互更容易。但事实上,从长远来看,它会更加复杂,相信我。坚持简单的解决方案,不要过度设计。 【参考方案1】:

使用语法创建表时:

CREATE TABLE xxx OF yyyy

您可以添加默认值和约束,但不能更改或指定列的类型。

SERIAL 类型实际上是数据类型、NOT NULL 约束和默认值规范的组合。相当于:

integer NOT NULL DEFAULT nextval('tablename_colname_seq')

见:documentation for SERIAL

因此,您将不得不使用:

CREATE SEQUENCE families_id_seq;

CREATE TABLE FAMILIES of FAMILY(
    id WITH OPTIONS NOT NULL DEFAULT nextval('families_id_seq'),
    name WITH OPTIONS NOT NULL
);

ALTER SEQUENCE families_id_seq OWNED BY FAMILIES.id;

您还必须手动创建序列families_id_seq,如上所示。

【讨论】:

没听懂。在文档中它说:“数据类型 smallserial、serial 和 bigserial 不是真正的类型,而仅仅是创建唯一标识符列的符号便利”。所以“序列”只是我应该用于我的序列(我必须创建)的词? @user3502170:如果您将serial 与“正常”表定义一起使用,则将在后台自动创建序列。但是当你使用一个类型的过于复杂的设置时,你需要自己做。

以上是关于为啥 SERIAL 不能在 Postgres 中处理这个简单的表?的主要内容,如果未能解决你的问题,请参考以下文章

Postgres 和 alembic - 假设 SERIAL 序列

为啥我不能使用 node-postgres 从数据库中删除?

避免在多台机器中重复增加 SERIAL 列

为啥没有为 Postgres 视图启用行级安全性?

在 Postgres 中的现有列中添加“串行”

在 PHP 中处理货币值的最佳实践?