我正在从MySQL切换到PostgreSQL,并想知道如何做自动增量值.我在PostgreSQL文档中看到了一个数据类型"serial",但是在使用它时会出现语法错误(在v8.0中).
我在postgres中有下表:
CREATE TABLE "test" (
"id" serial NOT NULL PRIMARY KEY,
"value" text
)
Run Code Online (Sandbox Code Playgroud)
我正在做以下插入:
insert into test (id, value) values (1, 'alpha')
insert into test (id, value) values (2, 'beta')
insert into test (value) values ('gamma')
Run Code Online (Sandbox Code Playgroud)
在前2个插入中,我明确提到了id.但是,在这种情况下,表的自动增量指针不会更新.因此在第3个插入中我得到错误:
ERROR: duplicate key value violates unique constraint "test_pkey"
DETAIL: Key (id)=(1) already exists.
Run Code Online (Sandbox Code Playgroud)
我从未在MyISAM和INNODB引擎中的Mysql中遇到过这个问题.显式与否,mysql总是根据最大行id更新自动增量指针.
postgres中这个问题的解决方法是什么?我需要它,因为我希望对我桌子中的某些ID进行更严格的控制.
更新: 我需要它,因为对于某些值我需要有一个固定的ID.对于其他新条目,我不介意创建新的条目.
我认为可以通过在我明确插入id时手动递增nextval指针来实现max(id) + 1.但我不知道该怎么做.
我应该在postgresql数据库表中为唯一键(例如用户的id)选择哪种数据类型?
bigint是一个吗?
谢谢
我想知道何时选择序列更好,何时使用串口更好.
我想要的是在插入后使用返回最后一个值
SELECT LASTVAL();
Run Code Online (Sandbox Code Playgroud)
我读了这个问题 PostgreSQL Autoincrement
我从来没有使用过串口.
我有一张名为 person 的表,其primary keyid 为 id;

我试图用以下内容插入到该表中:
insert into person (first_name, last_name, email, gender, date_of_birth, country_of_birth) values ('Ellissa', 'Gordge', 'ggordge0@gnu.org', 'Male', '2022-03-19', 'Fiji');
Run Code Online (Sandbox Code Playgroud)
不应该有任何ID被违反的约束,因为它是BIGSERIAL我得到的:
它表示 Key id=(8) 已经存在,并且每次尝试运行此命令时它都会递增。怎么可能ID已经存在了?为什么它不从列表底部开始递增?
如果我在插入语句中指定 id,并使用一个我知道唯一的数字,它就可以工作。我只是不明白为什么它不自动执行它,因为我正在使用BIGSERIAL.