gpt4 book ai didi

postgresql - 在 Postgresql 中插入自引用记录

转载 作者:行者123 更新时间:2023-11-29 11:15:37 26 4
gpt4 key购买 nike

给定 PostgreSQL 中的下表,我如何插入一条引用自身的记录?

CREATE TABLE refers (
id SERIAL PRIMARY KEY,
name VARCHAR(255) NOT NULL,
parent_id INTEGER NOT NULL,
FOREIGN KEY (parent_id) REFERENCES refers(id)
);

我在网上找的例子都是允许parent_id为NULL,然后用触发器更新的。如果可能的话,我宁愿一次性更新。

最佳答案

您可以从使用类型序列时自动创建的序列中选择 last_value:

create table test (
id serial primary key,
parent integer not null,
foreign key (parent) references test(id)
);

insert into test values(default, (select last_value from test_id_seq));
insert into test values(default, (select last_value from test_id_seq));
insert into test values(default, (select last_value from test_id_seq));

select * from test;
id | parent
----+--------
1 | 1
2 | 2
3 | 3
(3 rows)

下面的更简单的方法似乎也有效:

insert into test values(default, lastval());

虽然我不知道在使用多个序列时这将如何工作……我查了一下; lastval() 返回对任何序列的最后一次 nextval 或 setval 调用返回或设置的最后一个值,因此以下内容会给您带来麻烦:

create table test (
id serial primary key,
foo serial not null,
parent integer not null,
foreign key (parent) references test(id)
);

select setval('test_foo_seq', 100);

insert into test values(default, default, lastval());
ERROR: insert or update on table "test" violates foreign key constraint "test_parent_fkey"
DETAIL: Key (parent)=(101) is not present in table "test".

但是以下内容是可以的:

insert into test values(default, default, currval('test_id_seq'));

select * from test;
id | foo | parent
----+-----+--------
2 | 102 | 2
(1 row)

关于postgresql - 在 Postgresql 中插入自引用记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2127156/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com