标签: insert-update

插入MySQL表或更新(如果存在)

我想在数据库表中添加一行,但如果存在具有相同唯一键的行,我想更新该行.

例如,

insert into table (id, name, age) values(1, "A", 19)
Run Code Online (Sandbox Code Playgroud)

假设唯一的密钥是id,在我的数据库中有一行id = 1.在这种情况下,我想用这些值更新该行.通常这会产生错误.如果我使用insert IGNORE它将忽略错误,但它仍然不会更新.

mysql sql upsert insert-update

821
推荐指数
12
解决办法
78万
查看次数

如何在PostgreSQL中UPSERT(MERGE,INSERT ...在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');
Run Code Online (Sandbox Code Playgroud)

现在,假设你想"UPSERT"的元组(2, 'Joe'),(3, 'Alan'),因此新表的内容是:

(1, 'fred'),
(2, 'Joe'),    -- Changed value of existing tuple
(3, 'Alan')    -- Added new tuple
Run Code Online (Sandbox Code Playgroud)

这是人们在讨论时所谈论的内容upsert.至关重要的是,任何方法在同一个表上存在多个事务时都必须是安全的 - 通过使用显式锁定,或以其他方式抵御由此产生的竞争条件.

关于PostgreSQL中的重复更新,Insert上广泛讨论了这个主题,但这是关于MySQL语法的替代品,随着时间的推移,它已经成长为一些无关的细节.我正在研究明确的答案.

这些技术对于"插入如果不存在,否则什么都不做"也很有用,即"插入...复制键忽略".

postgresql upsert insert-update sql-merge

246
推荐指数
5
解决办法
18万
查看次数

如果存在,如何更新,如果没有(AKA"upsert"或"merge")在MySQL中插入?

使用一个MySQL查询时,是否存在一种简单的方法,INSERT当它不存在时,或者UPDATE它是否存在?

mysql sql upsert insert-update

150
推荐指数
2
解决办法
6万
查看次数

如果不存在SQL Server插入最佳实践

我有一个Competitions结果表,一方面保存团队成员的名字和他们的排名.

另一方面,我需要维护一个独特的竞争对手名称表:

CREATE TABLE Competitors (cName nvarchar(64) primary key)
Run Code Online (Sandbox Code Playgroud)

现在我在第一个表中有大约200,000个结果,当竞争对手表空时,我可以执行此操作:

INSERT INTO Competitors SELECT DISTINCT Name FROM CompResults
Run Code Online (Sandbox Code Playgroud)

查询只需要大约5秒钟就可以插入大约11,000个名称.

到目前为止,这不是一个关键应用程序,因此我可以考虑每月截断一次竞争对手表,当我收到大约10,000行的新竞争结果时.

但是,当新的和现有的竞争对手增加新的结果时,最佳做法是什么?我不想截断现有的竞争对手表

我只需要为新的竞争对手执行INSERT语句,如果它们存在则不执行任何操作.

sql-server insert-update

148
推荐指数
5
解决办法
32万
查看次数

INSERT INTO ... SELECT FROM ... on DUPLICATE KEY UPDATE

我正在进行插入查询,如果已经存在唯一键,则需要将大多数列更新为新值.它是这样的:

INSERT INTO lee(exp_id, created_by, 
                location, animal, 
                starttime, endtime, entct, 
                inact, inadur, inadist, 
                smlct, smldur, smldist, 
                larct, lardur, lardist, 
                emptyct, emptydur)
SELECT id, uid, t.location, t.animal, t.starttime, t.endtime, t.entct, 
       t.inact, t.inadur, t.inadist, 
       t.smlct, t.smldur, t.smldist, 
       t.larct, t.lardur, t.lardist, 
       t.emptyct, t.emptydur 
FROM tmp t WHERE uid=x
ON DUPLICATE KEY UPDATE ...; 
//update all fields to values from SELECT, 
//       except for exp_id, created_by, location, animal, 
//       starttime, endtime
Run Code Online (Sandbox Code Playgroud)

我不确定该UPDATE子句的语法应该是什么.我如何引用该SELECT子句中的当前行?

mysql insert-update

112
推荐指数
2
解决办法
12万
查看次数

为什么在我的`INSERT ... ON DUPLICATE KEY UPDATE`中影响了2行?

我正在INSERT ... ON DUPLICATE KEY UPDATEPRIMARY KEY下表中的a 做一个:

DESCRIBE users_interests;
Run Code Online (Sandbox Code Playgroud)
+------------+---------------------------------+------+-----+---------+-------+
| Field      | Type                            | Null | Key | Default | Extra |
+------------+---------------------------------+------+-----+---------+-------+
| uid        | int(11)                         | NO   | PRI | NULL    |       |
| iid        | int(11)                         | NO   | PRI | NULL    |       |
| preference | enum('like','dislike','ignore') | YES  |     | NULL    |       |
+------------+---------------------------------+------+-----+---------+-------+
Run Code Online (Sandbox Code Playgroud)

但是,即使这些值应该是唯一的,我也会看到2行受到影响.

INSERT INTO users_interests (uid, iid, preference) VALUES (2, 2, 'like')
ON DUPLICATE KEY UPDATE …
Run Code Online (Sandbox Code Playgroud)

mysql insert insert-update

82
推荐指数
2
解决办法
2万
查看次数

更新MySQL中的列

我有一个table1包含三列和一堆行的表:

[key_col|col_a|col_b]
Run Code Online (Sandbox Code Playgroud)

我想用一组值更新col_a(即保持col_b不变),如下所示:

INSERT INTO table1 AS t1 (key_col, col_a) VALUES ("k1", "foo"), ("k2", "bar");
Run Code Online (Sandbox Code Playgroud)


但它不起作用,我该怎么做?

mysql insert-update

66
推荐指数
3
解决办法
20万
查看次数

有没有办法在Zend Framework 1.5中执行"INSERT ... ON DUPLICATE KEY UPDATE"?

我想ON DUPLICATE KEY UPDATE在Zend Framework 1.5中使用,这可能吗?

INSERT INTO sometable (...)
VALUES (...)
ON DUPLICATE KEY UPDATE ...
Run Code Online (Sandbox Code Playgroud)

php mysql zend-framework insert-update

46
推荐指数
3
解决办法
2万
查看次数

DB2是否有"插入或更新"语句?

从我的代码(Java)我想确保在执行代码后数据库(DB2)中存在一行.

我的代码现在执行了一个select,如果没有返回结果,它会执行insert.我真的不喜欢这个代码,因为它在多线程环境中运行时会让我遇到并发问题.

我想要做的是将这个逻辑放在DB2而不是我的Java代码中.DB2有insert-or-update声明吗?或者我可以使用的任何类似的东西?

例如:

insertupdate into mytable values ('myid')
Run Code Online (Sandbox Code Playgroud)

另一种方法可能是始终执行insert并捕获"SQL-code -803主键已存在",但我想尽可能避免这种情况.

sql database db2 upsert insert-update

37
推荐指数
3
解决办法
5万
查看次数

.NET Dictionary:获取或创建新的

我经常发现自己创建了Dictionary一个非平凡的值类(例如List),然后在填充数据时总是编写相同的代码模式.

例如:

var dict = new Dictionary<string, List<string>>();
string key = "foo";
string aValueForKey = "bar";
Run Code Online (Sandbox Code Playgroud)

也就是说,我想插入"bar"与key对应的列表"foo",其中key "foo"可能不会映射到任何内容.

这是我使用不断重复的模式的地方:

List<string> keyValues;
if (!dict.TryGetValue(key, out keyValues))
  dict.Add(key, keyValues = new List<string>());
keyValues.Add(aValueForKey);
Run Code Online (Sandbox Code Playgroud)

有更优雅的方式吗?

相关问题没有这个问题的答案:

.net c# dictionary insert-update

37
推荐指数
5
解决办法
2万
查看次数