首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UPSERT Postgres 9.5

UPSERT Postgres 9.5
EN

Stack Overflow用户
提问于 2016-06-02 15:47:04
回答 2查看 274关注 0票数 1

我在CentOS 6上使用postgres9.5,我有下表(DDL)。

代码语言:javascript
复制
CREATE TABLE core_table.user_list(
  user_id SMALLSERIAL DEFAULT nextval('core_table.user_list_user_id_seq'::regclass) NOT NULL,
  user_name VARCHAR(50) NOT NULL,
  full_name VARCHAR(255),
  role_id INTEGER DEFAULT 1,
  is_accessible INTEGER DEFAULT 1,
  remarks VARCHAR(255),
  password VARCHAR(50),
  customer_schema VARCHAR(50),
  core_schema VARCHAR(50),
  CONSTRAINT user_list_pkey PRIMARY KEY(user_id, user_name),
  CONSTRAINT user_list_user_id_key UNIQUE(user_id)
) 
WITH (oids = false);

使用现有的4行数据。

代码语言:javascript
复制
Row 1:
user_id: 1
user_name: kelly
full_name: kelly petz
role_id: 1
is_accessible: 1
remarks: <null>
password: test123
customer_schema: kelly_db1
core_schema: kelly_db1

Row 2:
user_id: 2
user_name: kelly
full_name: kelly petz
role_id: 1
is_accessible: 1
remarks: <null>
password: test123
customer_schema: petz_db1
core_schema: kelly_db1

Row 3:
user_id: 3
user_name: sam
full_name: sam howiz
role_id: 1
is_accessible: 1
remarks: <null>
password: test456
customer_schema: kelly_db1
core_schema: kelly_db1

Row 4:
user_id: 4
user_name: jon
full_name: jon lam
role_id: 1
is_accessible: 1
remarks: <null>
password: test789
customer_schema: lam_db1
core_schema: lam_db1

当我尝试执行以下UPSERT时遇到错误。

代码语言:javascript
复制
INSERT INTO core_table.user_list 
(user_name, full_name, remarks, password, customer_schema, core_schema, role_id, is_accessible) 
VALUES 
('kelly', 'kelly petz', 'The Boss', 'test123', 'snoppy_db1', 'snoppy_db1', 1, 1) 
ON CONFLICT (user_name) 
DO UPDATE SET 
    password = 'test123', 
    remarks = 'The Boss';

错误是“错误:不存在与冲突规范匹配的唯一或排除约束”。

有没有人可以帮我指出我的错误,以及如何解决?

EN

回答 2

Stack Overflow用户

发布于 2016-06-02 15:50:14

如果对user_name列没有任何约束,就不会发生冲突,on conflict (user_name)就没有任何意义。

在这里,您需要对user_name列使用某种单一性约束。

例如

代码语言:javascript
复制
CREATE UNIQUE INDEX user_list_name_index on  user_list (user_name);

编辑以下评论:

看起来您需要这个表模式:

代码语言:javascript
复制
CREATE TABLE core_table.user_list(
  user_id SMALLSERIAL DEFAULT nextval('core_table.user_list_user_id_seq'::regclass) NOT NULL,
  user_name VARCHAR(50) NOT NULL,
  full_name VARCHAR(255),
  role_id INTEGER DEFAULT 1,
  is_accessible INTEGER DEFAULT 1,
  remarks VARCHAR(255),
  password VARCHAR(50),
  customer_schema VARCHAR(50),
  core_schema VARCHAR(50),
  CONSTRAINT user_list_pkey PRIMARY KEY(user_id, user_name),
  CONSTRAINT user_list_user_id_key UNIQUE(user_id),
  CONSTRAINT user_list_name_schema PRIMARY KEY(user_name, customer_schema),
) 
WITH (oids = false);

然后是这个on conflict子句:

代码语言:javascript
复制
INSERT INTO core_table.user_list 
(user_name, full_name, remarks, password, customer_schema, core_schema, role_id, is_accessible) 
VALUES 
('kelly', 'kelly petz', 'The Boss', 'test123', 'snoppy_db1', 'snoppy_db1', 1, 1) 
ON CONFLICT (user_list_name_schema) 
DO UPDATE SET 
    password = 'test123', 
    remarks = 'The Boss';
票数 0
EN

Stack Overflow用户

发布于 2016-06-02 15:52:47

当违反unique约束时,调用on conflict子句。在给定表中,user_name不是唯一的( user_iduser_name的组合是)。

如果你想使用这样的子句,你必须以某种方式使user_name唯一,例如,通过添加一个约束:

代码语言:javascript
复制
ALTER TABLE user_list ADD CONSTRAINT user_name_unique UNIQUE (user_name);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37585675

复制
相关文章

相似问题

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