stored-procedures - 发生冲突时如何使用新值进行更新
问题描述
create table new(id serial pk ,name varchar (10),age int)
id
是自动生成的。
insert into new (id,name,age)values(1,' xyz ',21)on conflict(id) do update set name=new_name,age=new_age
当id
它已经可用时,它应该update
使用主键 id 按新值排列。当我第一次插入数据时,我没有通过,id
因为它的串行类型会自动生成。在这种情况下,我可以发送id
,null
因为当我尝试更新该时间id
字段时是必需的。
解决方案
从问题中可以清楚地看出,您提供的代码不是您拥有的确切代码。正如您所描述的,由于您在没有被传递的情况下插入id
,因此您的实际代码大概如下所示:
insert into yourtable(name, age)
values(' xyz ', 21)
on conflict(id) do
update set name='new_name',age='new_age';
由于您没有通过a ,因此id
您将永远不会有 a conflict
,因此将插入所有内容。为了处理conflict
,您需要了解id
并执行以下操作:
insert into yourtable(id, name, age)
values(1, ' xyz ', 21)
on conflict(id) do
update set name='new_name',age='new_age';
很明显,你不一定知道记录的 id 是什么,但这是一个算法问题。您将需要找出它是什么id
。
请看https://www.postgresqltutorial.com/postgresql-upsert/
它有一个例子:
INSERT INTO customers (name, email)
VALUES('Microsoft','hotline@microsoft.com')
ON CONFLICT (name)
DO
UPDATE SET email = EXCLUDED.email || ';' || customers.email;
该表定义为
DROP TABLE IF EXISTS customers;
CREATE TABLE customers (
customer_id serial PRIMARY KEY,
name VARCHAR UNIQUE,
email VARCHAR NOT NULL,
active bool NOT NULL DEFAULT TRUE
);
请注意,name
因此unique
,如果insert
尝试添加name
已存在的记录,则命令包含在conflict
该记录中并且将被更新。如果您不提供id
,那么您的命令将不会有任何冲突,并且不会更新,而是insert
所有记录。
推荐阅读
- django - Django REST Serializer 使用错误的模型进行序列化
- python - python文件写入程序运行时如何更新桌面上的文件大小
- javascript - 使用 d3.js 更新表数据
- c# - C#捕获从不在进程中的函数返回的异常?
- r - 如何设置仅在输入 3 时才显示集合向量的函数?
- javascript - 如果 URI 没有改变,例如在单页应用程序上,如何检测用户是否在新页面上?
- angular - Angular Kendo UI 全局访问
- php - 内连接循环通过
- git - 如何 git rebase 从另一个分支直接到 master 分支?
- javascript - 受控数字比例映射