pg_dump 串行数据类型问题

Pet*_*ter 5 postgresql pg-dump auto-increment

有人可以向我解释为什么使用以下脚本创建 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")
)
Run Code Online (Sandbox Code Playgroud)

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");
Run Code Online (Sandbox Code Playgroud)

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

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

我在这里错过了什么吗?

joo*_*oop 1

嗯,它在这里有效。测试片段:

DROP SCHEMA tmpdump ;
CREATE SCHEMA tmpdump ;
set search_path = tmpdump ;

-- SELECT version();
DROP TABLE lusers;
CREATE TABLE lusers
(
  "id" serial NOT NULL
  , "name" character varying(150) NOT NULL
  , "surname" character varying (250) NOT NULL
  , "dept_id" integer NOT NULL
  , CONSTRAINT lusers_pkey PRIMARY KEY ("id")
);
INSERT INTO lusers ("name", "surname", "dept_id") VALUES
         ('Joop', 'Zoetemelk', 2) , ('Jan', 'Jansen', 3)
         , ('Ard', 'Schenk', 4) , ('Kees', 'Verkerk', 5);
Run Code Online (Sandbox Code Playgroud)

仅转储tmpdump架构:

pg_dump -U someusername yourdbname -n tmpdump -F p --inserts | less
Run Code Online (Sandbox Code Playgroud)