Questions tagged «upsert»

对于与执行upsert(组合更新/插入)操作有关的问题。

11
插入MySQL表或更新(如果存在)
我想向数据库表中添加一行,但是如果存在具有相同唯一键的行,我想更新该行。 例如: insert into table (id, name, age) values(1, "A", 19) 假设唯一键为id,并且在我的数据库中有一行id = 1。在这种情况下,我想用这些值更新该行。通常,这会产生错误。 如果使用insert IGNORE它,将忽略该错误,但仍不会更新。

16
插入,在PostgreSQL中重复更新吗?
几个月前,我从关于Stack Overflow的答案中学到了如何使用以下语法在MySQL中一次执行多个更新: INSERT INTO table (id, field, field2) VALUES (1, A, X), (2, B, Y), (3, C, Z) ON DUPLICATE KEY UPDATE field=VALUES(Col1), field2=VALUES(Col2); 我现在已经切换到PostgreSQL,显然这是不正确的。它指的是所有正确的表,因此我认为这是使用不同关键字的问题,但是我不确定在PostgreSQL文档的哪个地方覆盖了这个问题。 为了澄清,我想插入几件事,如果它们已经存在,请对其进行更新。


18
SQLite-UPSERT *不是* INSERT或REPLACE
http://en.wikipedia.org/wiki/Upsert 在SQL Server上插入更新存储的proc 在我没有想到的SQLite中,有什么聪明的方法可以做到这一点吗? 基本上,如果记录存在,我想更新四列中的三列;如果不存在,我想使用第四列的默认(NUL)值插入记录。 ID是一个主键,因此UPSERT只会有一个记录。 (我试图避免SELECT的开销,以便确定是否需要显式更新或插入) 有什么建议吗? 我无法在SQLite网站上确认TABLE CREATE的语法。我还没有建立一个演示来测试它,但是似乎不被支持。 如果是的话,我有三列,因此实际上看起来像: CREATE TABLE table1( id INTEGER PRIMARY KEY ON CONFLICT REPLACE, Blob1 BLOB ON CONFLICT REPLACE, Blob2 BLOB ON CONFLICT REPLACE, Blob3 BLOB ); 但前两个Blob不会引起冲突,只有ID会发生冲突,因此我不会替换Blob1和Blob2(根据需要) 当绑定数据是一个完整的事务时,SQLite中的UPDATE意味着要更新的每个发送行都需要:Prepare / Bind / Step / Finalize语句,与INSERT不同,后者允许使用reset函数 语句对象的寿命如下所示: 使用sqlite3_prepare_v2()创建对象 使用sqlite3_bind_接口将值绑定到主机参数。 通过调用sqlite3_step()运行SQL 使用sqlite3_reset()重置该语句,然后返回到步骤2并重复。 使用sqlite3_finalize()销毁语句对象。 我猜测UPDATE与INSERT相比比较慢,但是与使用主键的SELECT相比又如何呢? 也许我应该使用select读取第4列(Blob3),然后使用REPLACE编写一条将原始第4列与前3列的新数据混合在一起的新记录?
535 sql  sqlite  upsert 

17
Postgres:如果尚不存在,请插入
我正在使用Python写入postgres数据库: sql_string = "INSERT INTO hundred (name,name_slug,status) VALUES (" sql_string += hundred + ", '" + hundred_slug + "', " + status + ");" cursor.execute(sql_string) 但是由于我的某些行是相同的,因此出现以下错误: psycopg2.IntegrityError: duplicate key value violates unique constraint "hundred_pkey" 如何编写“除非此行已存在,否则请插入” SQL语句? 我看过这样的复杂语句: IF EXISTS (SELECT * FROM invoices WHERE invoiceid = '12345') UPDATE invoices SET …

12
Oracle:如何UPSERT(更新或插入到表中?)
UPSERT操作会更新表或在表中插入一行,这取决于表是否已经有与数据匹配的行: if table t has a row exists that has key X: update t set mystuff... where mykey=X else insert into t mystuff... 由于Oracle没有特定的UPSERT语句,执行此操作的最佳方法是什么?
293 sql  oracle  merge  upsert 

6
如何在PostgreSQL中进行UPSERT(MERGE,INSERT…ON DUPLICATE UPDATE)?
这里一个非常常见的问题是如何进行upsert,这是MySQL调用的内容,INSERT ... ON DUPLICATE UPDATE并且该标准支持该MERGE操作。 鉴于PostgreSQL不直接支持它(在9.5版之前),您该怎么做?考虑以下: CREATE TABLE testtable ( id integer PRIMARY KEY, somedata text NOT NULL ); INSERT INTO testtable (id, somedata) VALUES (1, 'fred'), (2, 'bob'); 现在,假设你想“UPSERT”的元组(2, 'Joe'),(3, 'Alan'),因此新表的内容是: (1, 'fred'), (2, 'Joe'), -- Changed value of existing tuple (3, 'Alan') -- Added new tuple 那就是人们在讨论时谈论的话题upsert。至关重要的是,在存在多个事务处理同一个表的情况下,任何方法都必须安全 -通过使用显式锁定或以其他方式抵御由此产生的竞争条件。 …


6
如何在PostgreSQL中将RETURNING和ON CONFLICT一起使用?
我在PostgreSQL 9.5中具有以下UPSERT: INSERT INTO chats ("user", "contact", "name") VALUES ($1, $2, $3), ($2, $1, NULL) ON CONFLICT("user", "contact") DO NOTHING RETURNING id; 如果没有冲突,则返回以下内容: ---------- | id | ---------- 1 | 50 | ---------- 2 | 51 | ---------- 但是,如果有冲突,则不会返回任何行: ---------- | id | ---------- id如果没有冲突,我想返回新的列,或者返回id冲突列的现有列。 能做到吗?如果是这样,怎么办?

1
PostgreSQL在冲突更新中插入(向上更新)使用所有排除的值
当您升级一行(PostgreSQL> = 9.5),并且希望可能的INSERT与可能的UPDATE完全相同时,可以这样编写: INSERT INTO tablename (id, username, password, level, email) VALUES (1, 'John', 'qwerty', 5, 'john@mail.com') ON CONFLICT (id) DO UPDATE SET id=EXCLUDED.id, username=EXCLUDED.username, password=EXCLUDED.password, level=EXCLUDED.level,email=EXCLUDED.email 有没有更短的方法?只能说:使用所有EXCLUDE值。 在SQLite中,我曾经做过: INSERT OR REPLACE INTO tablename (id, user, password, level, email) VALUES (1, 'John', 'qwerty', 5, 'john@mail.com')

9
在SQL Server上插入更新存储的proc
我编写了一个存储的proc,如果有记录,它将进行更新,否则它将进行插入。看起来像这样: update myTable set Col1=@col1, Col2=@col2 where ID=@ID if @@rowcount = 0 insert into myTable (Col1, Col2) values (@col1, @col2) 我以这种方式编写代码的逻辑是,更新将使用where子句执行隐式选择,如果返回0,则将进行插入。 用这种方法的替代方法是先进行选择,然后根据返回的行数进行更新或插入。我认为这种方法效率低下,因为如果要进行更新,则会导致2个选择(第一个显式的select调用和第二个隐式的update调用)。如果proc进行插入操作,则效率没有差异。 我的逻辑声音在这里吗?这是将插入和更新合并到存储过程中的方式吗?

7
SQLite UPSERT /更新或插入
我需要对SQLite数据库执行UPSERT / INSERT或UPDATE。 有INSERT或REPLACE命令,在许多情况下可能会有用。但是,如果您由于外键而希望使用自动增量功能将ID保留在原位,则该操作将无效,因为它会删除该行,创建一个新行,因此此新行具有一个新ID。 表格如下: 播放器-(ID上的主键,user_name唯一) | id | user_name | age | ------------------------------ | 1982 | johnny | 23 | | 1983 | steven | 29 | | 1984 | pepee | 40 |
102 database  sqlite  upsert 

5
SQLite插入-重复键更新(UPSERT)
MySQL有这样的东西: INSERT INTO visits (ip, hits) VALUES ('127.0.0.1', 1) ON DUPLICATE KEY UPDATE hits = hits + 1; 据我所知,SQLite中不存在此功能,我想知道的是,是否有任何方法可以实现相同的效果而不必执行两个查询。另外,如果这不可能,那么您更喜欢什么: SELECT +(插入或更新)或 UPDATE(如果UPDATE失败,则 + INSERT )
98 sql  mysql  database  sqlite  upsert 

9
在ON CONFLICT子句中使用多个flict_target
我在表中两列col1,col2他们都是独一无二的索引(COL1是唯一的,因此是COL2)。 我需要在此表中插入,使用ON CONFLICT语法并更新其他列,但不能在inconflict_target子句中同时使用这两列。 有用: INSERT INTO table ... ON CONFLICT ( col1 ) DO UPDATE SET -- update needed columns here 但是如何对几个列执行此操作,如下所示: ... ON CONFLICT ( col1, col2 ) DO UPDATE SET ....

10
如何更新表中的行或将其插入(如果不存在)?
我有下表的计数器: CREATE TABLE cache ( key text PRIMARY KEY, generation int ); 我想增加一个计数器,如果相应的行还不存在,则将其设置为零。有没有办法在标准SQL中没有并发问题的情况下做到这一点?该操作有时是事务的一部分,有时是独立的。 如果可能,SQL必须在SQLite,PostgreSQL和MySQL上未经修改地运行。 搜索产生了一些想法,这些想法可能遇到并发问题,或者特定于数据库: 尝试到INSERT新行,UPDATE如果有错误。不幸的是,该错误会INSERT中止当前事务。 UPDATE该行,如果未修改任何行,则为INSERT新行。 MySQL有一个ON DUPLICATE KEY UPDATE子句。 编辑:感谢所有的伟大答复。看起来Paul是对的,而且没有一种可移植的方式来做到这一点。这对我来说是非常令人惊讶的,因为这听起来像是一个非常基本的操作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.