有人可以向我解释一下为什么使用以下脚本创建 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 to integer?当我从转储的 SQL 文件恢复数据库时,它几乎变得毫无用处,因为自动增量停止工作,并且当从前端表单添加新记录时,它会失败并显示“id 字段不能为空”消息,显然因为它是设置为非空的主键,但自动增量应该启动并使用序列中的下一个值填充该字段。
我在这里错过了什么吗?
From docs http://www.postgresql.org/docs/9.4/static/datatype-numeric.html#DATATYPE-SERIAL:
数据类型smallserial
, serial
and bigserial
不是真正的类型,而仅仅是创建唯一标识符列的符号方便(类似于某些其他数据库支持的 AUTO_INCRMENT 属性)。在当前的实现中,指定:
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 约束以防止意外插入重复值,但这不是自动的。)最后,序列被标记为列“拥有”,以便它如果删除列或表,也会删除。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)