Dro*_*dOS 6 postgresql auto-increment
我正在从 MariaDB 切换到 Postgres 的过程中,遇到了一个小问题。有时我需要在进行 INSERT 之前建立下一个 AUTO_INCRMENT 值。这是因为 INSERT 对其他一些表有影响,如果完成后 INSERT 本身的修复,这些表将变得非常混乱。在 mySQL/MariaDB 中这很容易。我只是做了
"SELECT AUTO_INCREMENT
FROM information_schema.tables
WHERE table_name = 'users'
AND table_schema = DATABASE( ) ;";
Run Code Online (Sandbox Code Playgroud)
并在进行实际插入之前使用返回的值预先更正其他表。我知道 pgSQL 可以与RETURNINGSELECT、INSERT 和 UPDATE 语句一起使用。然而,这需要对其他表进行插入后更正,这反过来又会破坏已经测试并证明有效的代码。我想有一种方法可以找到下一个 AUTO_INCRMENT 但我一直找不到它。除其他外,我尝试过nextval('users_id_seq')但没有做任何有用的事情。
为了将我的原始 MariaDB 模式移植到 Postgres,我使用 MariaDB 版本编辑了 Adminer 发出的 SQL,以确保它可以与 Postgres 一起使用。这主要涉及将 INT(11) 更改为 INTEGER,将 TINYINT(3) 更改为 SMALL INT,将 VARCHAR 更改为 CHARACTER VARYING 等。通过自动增量列,我读了一下并得出结论,我需要使用 SERIAL。所以我提供给 Postgres 的典型 SQL 是这样的
CREATE TABLE "users"
(
"id" SERIAL NOT NULL,
"bid" INTEGER NOT NULL DEFAULT 0,
"gid" INTEGER NOT NULL DEFAULT 0,
"sid" INTEGER NOT NULL DEFAULT 0,
"s1" character varying(64)NOT NULL,
"s2" character varying(64)NOT NULL,
"name" character varying(64)NOT NULL,
"apik" character varying(128)NOT NULL,
"email" character varying(192)NOT NULL,
"gsm" character varying(64)NOT NULL,
"rights" character varying(64)NOT NULL,
"managed" character varying(256)NOT NULL DEFAULT
'M_BepHJXALYpLyOjHxVGWJnlAMqxv0KNENmcYA,,',
"senior" SMALLINT NOT NULL DEFAULT 0,
"refs" INTEGER NOT NULL DEFAULT 0,
"verified" SMALLINT NOT NULL DEFAULT 0,
"vkey" character varying(64)NOT NULL,
"lang" SMALLINT NOT NULL DEFAULT 0,
"leader" INTEGER NOT NULL
);
Run Code Online (Sandbox Code Playgroud)
从管理员运行的 SQL 运行正常。然而,当我尝试让管理员导出usersPostgres 中的新表时,它给了我
CREATE TABLE "public"."users"
(
"id" integer DEFAULT nextval('users_id_seq') NOT NULL,
"bid" integer DEFAULT 0 NOT NULL,
Run Code Online (Sandbox Code Playgroud)
在移植 AUTO_INCRMENT 列时,我可能错误地处理了问题 - 在这种情况下,仍然有时间纠正错误。
fog*_*fog 10
serial如果在列定义中使用,则您将拥有一个TABLE_COLUMN_seq在表的同一命名空间中命名的序列(其中TABLE和COLUMN分别是表和列的名称)。你可以这样做:
SELECT nextval('TABLE_COLUMN_seq');
我看到您已经尝试过,您可以出示您的CREATE TABLE声明以便我们检查所有名称是否正常?
小智 4
正如手册中所述 serial,它不是“真正的”数据类型,它只是从序列中获取默认值的列的快捷方式。
如果您在插入之前需要在代码中生成的值,请使用nextval()然后使用在插入语句中获得的值:
在 PL/pgSQL 中,这将类似于以下内容。确切的语法显然取决于您使用的编程语言:
declare
l_userid integer;
begin
l_userid := nextval('users_id_seq');
-- do something with that value
insert into users (id, ...)
values (l_userid, ...);
end;
Run Code Online (Sandbox Code Playgroud)
重要的是,切勿将不是由序列生成的值传递给插入语句。Postgres 不会自动将序列值与“手动”提供的值同步。
| 归档时间: |
|
| 查看次数: |
24862 次 |
| 最近记录: |