gpt4 book ai didi

postgresql - pg_dump 串行数据类型问题

转载 作者:行者123 更新时间:2023-11-29 11:33:26 25 4
gpt4 key购买 nike

有人可以向我解释为什么使用以下脚本创建 PostgreSQL 表:

CREATE TABLE users
(
"id" serial NOT NULL,
"name" character varying(150) NOT NULL,
"surname" character varying (250) NOT NULL,
"dept_id" integer NOT NULL,
CONSTRAINT users_pkey PRIMARY KEY ("id")
)

以下列格式被 pg_dump 转储:

CREATE TABLE users(
"id" integer NOT NULL,
"name" character varying(150) NOT NULL,
"surname" character varying (250) NOT NULL,
"dept_id" integer NOT NULL
);

ALTER TABLE users OWNER TO postgres;

CREATE SEQUENCE "users_id_seq"
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;

ALTER TABLE "users_id_seq" OWNER TO postgres;
ALTER SEQUENCE "users_id_seq" OWNED BY users."id";
ALTER TABLE ONLY users
ADD CONSTRAINT users_pkey PRIMARY KEY ("id");

显然以上只是从转储文件中提取的一小部分。

为什么 pg_dump 将数据类型 serial 转换为 integer?当我从转储的 SQL 文件恢复数据库时,它几乎变得毫无用处,因为自动增量停止工作,并且当从前端表单添加新记录时,它失败并显示“id 字段不能为空”的消息,显然因为它是一个设置为非空的主键,但自动递增应该启动并用序列中的下一个值填充该字段。

我是不是漏掉了什么?

最佳答案

来自 docs :

数据类型 smallserialserialbigserial 不是真正的类型,而仅仅是创建唯一标识符列的符号方便(类似于其他一些数据库支持的 AUTO_INCREMENT 属性)。在当前的实现中,指定:

CREATE TABLE tablename (
colname SERIAL
);

相当于指定:

CREATE SEQUENCE tablename_colname_seq;
CREATE TABLE tablename (
colname integer NOT NULL DEFAULT nextval('tablename_colname_seq')
);
ALTER SEQUENCE tablename_colname_seq OWNED BY tablename.colname;

因此,我们创建了一个整数列,并安排其默认值由序列生成器分配。应用 NOT NULL 约束以确保不能插入空值。 (在大多数情况下,您还希望附加 UNIQUE 或 PRIMARY KEY 约束以防止意外插入重复值,但这不是自动的。)最后,序列被标记为“由”列拥有,因此它如果列或表被删除,将被删除。

关于postgresql - pg_dump 串行数据类型问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33038651/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com