为啥 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 序列