gpt4 book ai didi

sql - 唯一性由两列的组合确定时的 UPDATE OR INSERT 函数

转载 作者:行者123 更新时间:2023-11-29 12:47:17 25 4
gpt4 key购买 nike

扩展通常的 INSERT OR UPDATE conondrum

我有一个服务于正常 UPDATE 或 INSERT 的函数,它看起来像这样:

CREATE OR REPLACE FUNCTION updateslave ( varchar(7), smallint ) RETURNS void AS
$$
BEGIN
LOOP
UPDATE consist SET
master = $1,
time = now() WHERE slave = $2;
IF found THEN
RETURN;
END IF;
BEGIN
INSERT INTO consist(master, slave, time) VALUES ( $1, $2, now() );
RETURN;
EXCEPTION WHEN unique_violation THEN
-- do nothing, then loop and retry
END;
END LOOP;
END;
##
LANGUAGE plpgsql;

现在,问题是我正在尝试重写它以在不同的表中执行类似的操作。但是,不同之处在于,在另一个表中没有单独的唯一列,而是两列的组合只存在于一行中。是否可以改为基于两列的组合来声明 unique_violation?

为了保持示例简单,我们假设该表看起来与我使用上述函数的表完全相同,但主从是共同产生唯一性的两列:

 Column |            Type             |                  Modifiers                   | Storage  | Description
--------+-----------------------------+----------------------------------------------+----------+-------------
master | character varying(7) | not null default 'unused'::character varying | extended |
slave | smallint | not null | plain |
time | timestamp without time zone | default now() | plain |

最佳答案

最好的方法是在表上定义一个唯一约束,这样无论更新如何发生,即无论是否使用您的过程,一切都可以。

最简单的方法是在两列上创建唯一索引:

create unique index any_mame on mytable(col1, col2);

您也可以更改表以添加唯一约束,但差别不大。

关于sql - 唯一性由两列的组合确定时的 UPDATE OR INSERT 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13614407/

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