首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >同时更新多条记录上的关键约束

同时更新多条记录上的关键约束
EN

Stack Overflow用户
提问于 2022-04-07 15:14:42
回答 1查看 41关注 0票数 0

正如@Tony‘’Hagan here所提到的,我们有一个具有唯一键的表,该表通过“老化”旧记录进行更新。

该表如下:

代码语言:javascript
复制
-- auto-generated definition
create table abc
(
    key   uuid    not null,
    hash  text    not null,
    age   integer not null,
    value varchar(50),
    constraint abc_pkey
        primary key (key, age)
);

我们可以使用以下虚拟数据模拟“老化”记录:

代码语言:javascript
复制
INSERT INTO public.abc (key, hash, age, value) VALUES ('bec619bb-451c-49d8-b555-4d16e1f724fb', 'asdf', 0, '1');
INSERT INTO public.abc (key, hash, age, value) VALUES ('bec619bb-451c-49d8-b555-4d16e1f724fb', 'asdf', 1, '2');
INSERT INTO public.abc (key, hash, age, value) VALUES ('bec619bb-451c-49d8-b555-4d16e1f724fb', 'asdf', 2, '3');

当我想要添加一个新记录时,我必须先“老化”旧记录,然后再用age=0插入一个新记录。

但是,当我运行下面的查询时,会得到以下错误消息:

代码语言:javascript
复制
[23505] ERROR: duplicate key value violates unique constraint "abc_pkey" Detail: Key (key, age)=(bec619bb-451c-49d8-b555-4d16e1f724fb, 2) already exists.

UPDATE abc
SET age = age +1
WHERE key IN (
    'bec619bb-451c-49d8-b555-4d16e1f724fb'
    )

我如何更新/老化这些记录?

EN

回答 1

Stack Overflow用户

发布于 2022-04-07 15:41:40

我们可以使用命令禁用约束。

代码语言:javascript
复制
SET CONSTRAINTS ALL DEFERRED

它允许我们运行更新程序

代码语言:javascript
复制
UPDATE public.abc SET age = age + 1;

3行影响

然后,我们可以用以下方法重新激活约束

代码语言:javascript
复制
SET CONSTRAINTS ALL IMMEDIATE

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71784711

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档