我开始作为一个问题来写这篇文章,但是在重现错误时,我在 PostgreSQL 文档中找到了解决方案。因此,我将在这里为社区分享解决方案。
PostgreSQL 14 表的一些数据被意外删除。
-- Creating table
CREATE TABLE my_table (
id integer not null primary key generated always as identity,
description varchar(50) not null
);
-- Filling data
INSERT INTO my_table (description)
VALUES
('Option A'), ('Option B'), ('Option C'), ('Option D'), ('Option E'),
('Option F'), ('Option G'), ('Option H'), ('Option I'), ('Option J');
SELECT * FROM my_table;
id | description
----+------------
1 | Option A
2 | Option B
3 | Option C
4 | Option D
5 | Option E
6 | Option F
7 | Option G
8 | Option H
9 | Option I
10 | Option J
意外删除:
DELETE FROM my_table WHERE id IN (6,7,8);
SELECT * FROM my_table;
id | description
----+------------
1 | Option A
2 | Option B
3 | Option C
4 | Option D
5 | Option E
9 | Option I
10 | Option J
为了将这些行重新插入表中,我尝试运行以下指令,显式定义“id”列的值,但它引发了异常:
INSERT INTO my_table (id, description)
VALUES
(6, 'Option F'), (7, 'Option G'), (8, 'Option H');
[428C9] ERROR: cannot insert a non-DEFAULT value into column "id" Detail: Column "id" is an identity column defined as GENERATED ALWAYS. Hint: Use OVERRIDING SYSTEM VALUE to override.
幸运的是,PostgreSQL 错误消息非常有帮助。
按照 PostgreSQl 引擎显示的提示,我添加了指令“OVERRIDING SYSTEM VALUE”,它完美地工作了:
我希望这对那些面临与我相同问题的人有用。
干杯!
您收到错误是因为该列是使用“GENERATED ALWAYS”创建的。
如果您使用“GENERATED BY DEFAULT”,那么您可以将值插入到该列中,在这种情况下,它将不会生成。