天道酬勤,学无止境

如何使用 SQL - INSERT…ON DUPLICATE KEY UPDATE?(How to use SQL - INSERT…ON DUPLICATE KEY UPDATE?)

问题

我有一个脚本可以捕获推文并将它们放入数据库。 我将在 cronjob 上运行脚本,然后在我的网站上显示来自数据库的推文,以防止达到 twitter API 的限制。

所以我不想在我的数据库中有重复的推文,我知道我可以使用“INSERT...ON DUPLICATE KEY UPDATE”来实现这一点,但我不太明白如何使用它。

我的数据库结构如下。

表 - 哈希 id (auto_increment) 推文用户 user_url

目前我要插入的 SQL 如下:

$tweet = $clean_content[0];
$user_url = $clean_uri[0];
$user = $clean_name[0];

$query='INSERT INTO hash (tweet, user, user_url) VALUES ("'.$tweet.'", "'.$user.'", "'.$user_url.'")';
mysql_query($query);

我将如何正确使用 'INSERT...ON DUPLICATE KEY UPDATE' 仅在它不存在时插入,如果存在则更新?

谢谢

回答1

你的表上需要一些唯一键,如果 user_url 是 tweer_url,那么这应该适合(每条推文都有一个唯一的 url,id 会更好)。

CREATE TABLE `hash` (
  `user_url` ...,
  ...,
  UNIQUE KEY `user_url` (`user_url`)
);

最好在你的情况下使用 INSERT IGNORE

$query='INSERT IGNORE INTO hash (tweet, user, user_url) VALUES ("'.$tweet.'", "'.$user.'", "'.$user_url.'")';

当您需要更新现有行但只想插入一次时,ON DUPLICATE KEY 很有用

回答2

尝试使用:

$query='INSERT INTO hash (tweet, user, user_url) 
        VALUES ("'.$tweet.'", "'.$user.'", "'.$user_url.'") 
        ON DUPLICATE KEY UPDATE tweet = VALUES(tweet)';
回答3

ON DUPLICATE KEY UPDATE 在这里似乎不是正确的解决方案,因为如果值已经在表中,您不想更新。

我会使用 Twitter 自己唯一的状态 ID 字段(对于每条推文应该是唯一的)而不是您的哈希 ID。 将其添加为表中的字段,并将其定义为主键(或唯一索引)。然后使用 REPLACE INTO,包括来自 Twitter 的状态 ID。

这样做的好处是您可以始终将您的记录追溯到 Twitter 上的唯一推文,因此您可以在需要时轻松获取有关该推文的更多信息。

标签

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 如何在CodeIgniter模型中使用ON DUPLICATE KEY UPDATE?(How would I use ON DUPLICATE KEY UPDATE in my CodeIgniter model?)
    问题 我有一个CodeIgniter / PHP模型,我想在数据库中插入一些数据。 但是,我在“原始” SQL查询中设置了此设置: ON DUPLICATE KEY UPDATE duplicate=duplicate+1 我正在使用CodeIgniter,并将以前的所有控制器内SQL查询都转换为ActiveRecord 。 有什么办法可以在基于ActiveRecord的模型中做到这一点? 谢谢! 杰克 回答1 您可以添加“ ON DUPLICATE”语句,而无需修改任何核心文件。 $sql = $this->db->insert_string('table', $data) . ' ON DUPLICATE KEY UPDATE duplicate=LAST_INSERT_ID(duplicate)'; $this->db->query($sql); $id = $this->db->insert_id(); 我希望它会帮助某人。 回答2 以下过程在Codeigniter 3.0.6中对我有用 public function updateOnDuplicate($table, $data ) { if (empty($table) || empty($data)) return false; $duplicate_data = array(); foreach($data AS
  • 如何在mysql的PDO中使用ON DUPLICATE KEY UPDATE?(How can I use ON DUPLICATE KEY UPDATE in PDO with mysql?)
    问题 细节 我正在做一次插入操作,以期新的或更新的许可证到期。 有效期为插入日期后的2年。 如果检测到重复,则条目将更新,以使到期日等于剩余的到期日加2年。 关于重复项,在下面的示例中,应该只有一行包含user_id = 55和licence = commercial。 表格: licence_expiry -------------------------------------------------------- | user_id | licence | expiry | -------------------------------------------------------- | 55 | commercial | 2013-07-04 05:13:48 | --------------------------------------------------------- user_id(int11),许可证(varchan50),有效期(DATETIME) 我认为在mysql中,您会这样写(请注意,我尚未检查代码是否在mysql中有效。) INSERT INTO `licence_expiry` (`user_id`, `licence`, `expiry`) VALUES (55, commercial, NOW()+ INTERVAL 2 YEAR) ON
  • MySQL INSERT…使用django 1.4进行重复密钥更新以进行批量插入(MySQL INSERT … ON DUPLICATE KEY UPDATE with django 1.4 for bulk insert)
    问题 我在使用django 1.4进行DUPLICATE KEY UPDATE时遇到了MySQL INSERT问题。 我尝试插入记录的表具有2列(复合)唯一键。 我收到的记录来自第三方,其值会随着时间而变化,除了那些具有唯一键集的字段。 我一次收到1〜5k记录,因此需要 目前,我正在使用Model.objects.bulk_create进行批量插入,性能实在是惊人的,因为无论记录集有多大,它通常都会发出一个查询。 但是,由于我的记录可以在第三方随时间变化,因此我需要在记录集上执行MySQL INSERT ... ON DUPLICATE KEY UPDATE查询。 我打算编写原始SQL语句并使用类似以下内容的代码执行: sql = "MySQL INSERT ... ON DUPLICATE KEY UPDATE" raw_insert(sql) def raw_insert(sql): from django.db import connection, transaction cursor = connection.cursor() # Data modifying operation - commit required cursor.execute(sql) transaction.commit_unless_managed() return 1
  • 插入,在PostgreSQL中重复更新吗?(Insert, on duplicate update in 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文档的哪个地方覆盖了这个问题。 为了澄清,我想插入几件事,如果它们已经存在,请对其进行更新。 回答1 自9.5版起的PostgreSQL具有UPSERT语法,带有ON CONFLICT子句。 使用以下语法(类似于MySQL) INSERT INTO the_table (id, column_1, column_2) VALUES (1, 'A', 'X'), (2, 'B', 'Y'), (3, 'C', 'Z') ON CONFLICT (id) DO UPDATE SET column_1 = excluded.column_1, column_2 = excluded.column_2; 在postgresql的电子邮件组归档中搜索“
  • 如何在SQL Server 2005中向上插入(更新或插入)(How to upsert (update or insert) in SQL Server 2005)
    问题 我有一个表,在其中我要为员工插入行,但是下次我要插入行时,我不想再次为该员工插入数据,只是想用必需的列进行更新(如果不存在则退出该列,然后创建新行) 我们如何在SQL Server 2005中做到这一点? 我正在使用jsp 我的查询是 String sql="insert into table1(id,name,itemname,itemcatName,itemQty)values('val1','val2','val3','val4','val5')"; 如果是第一次,则将其插入数据库,如果存在,则将其更新 怎么做? 回答1 尝试检查是否存在: IF NOT EXISTS (SELECT * FROM dbo.Employee WHERE ID = @SomeID) INSERT INTO dbo.Employee(Col1, ..., ColN) VALUES(Val1, .., ValN) ELSE UPDATE dbo.Employee SET Col1 = Val1, Col2 = Val2, ...., ColN = ValN WHERE ID = @SomeID 您可以轻松地将其包装到存储过程中,而只需从外部调用该存储过程(例如,从C#之类的编程语言或所使用的任何语言)。 更新:您可以只将整个语句写成一个长字符串(可以-但不是非常有用)
  • MySQL ON DUPLICATE KEY UPDATE用于在单个查询中插入多行(MySQL ON DUPLICATE KEY UPDATE for multiple rows insert in single query)
    问题 我有一个SQL查询,我想在单个查询中插入多行。 所以我用了类似的东西: $sql = "INSERT INTO beautiful (name, age) VALUES ('Helen', 24), ('Katrina', 21), ('Samia', 22), ('Hui Ling', 25), ('Yumie', 29)"; mysql_query( $sql, $conn ); 问题是,当我执行此查询时,我想检查是否应该检查一个UNIQUE键(不是PRIMARY KEY ),例如上面的'name' ,并且如果已经存在这样的'name' ,则应该对应的整行更新,否则插入。 例如,在下面的示例中,如果数据库中已经存在'Katrina' ,则应更新整行,而不考虑字段数。 同样,如果不存在'Samia' ,则应插入该行。 我想到使用: INSERT INTO beautiful (name, age) VALUES ('Helen', 24), ('Katrina', 21), ('Samia', 22), ('Hui Ling', 25), ('Yumie', 29) ON DUPLICATE KEY UPDATE 这是陷阱。 我对如何进行感到困惑和困惑。 我一次有多行要插入/更新。 请给我一个方向。 谢谢。 回答1 从MySQL 8.0.19开始,您可以为该行使用别名
  • 在重复键+自动增加问题mysql(ON DUPLICATE KEY + AUTO INCREMENT issue mysql)
    问题 我有这样的表结构 当我向表中插入行时,我正在使用以下查询: INSERT INTO table_blah ( material_item, ... hidden ) VALUES ( data, ... data ) ON DUPLICATE KEY UPDATE id = id, material_item = data, ... hidden = data; 当我第一次插入数据而不触发ON DUPLICATE KEY ,id会很好地递增: 但是当ON DUPLICATE KEY触发并且我插入新行时,id对我来说很奇怪: 我如何保持auto increment ,即使它触发了ON DUPLICATE KEY也会正确递增? 回答1 记录了此行为(括号中的段落): 如果指定ON DUPLICATE KEY UPDATE,并且插入一行会导致UNIQUE索引或PRIMARY KEY中的值重复,则MySQL将对旧行执行UPDATE。 例如,如果将列a声明为UNIQUE并包含值1,则以下两个语句具有相似的作用: INSERT INTO table (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE c=c+1; UPDATE table SET c=c+1 WHERE a=1; (对于a是自动递增列的InnoDB表,效果并不相同。对于自动递增列
  • 如何在PostgreSQL中进行UPSERT(MERGE,INSERT…ON DUPLICATE UPDATE)?(How to UPSERT (MERGE, INSERT … ON DUPLICATE UPDATE) in PostgreSQL?)
    问题 这里一个非常常见的问题是如何进行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'); 现在,假设您要“向上插入”元组(2, 'Joe') , (3, 'Alan') ,那么新表的内容将是: (1, 'fred'), (2, 'Joe'), -- Changed value of existing tuple (3, 'Alan') -- Added new tuple 那就是人们在讨论upsert时谈论的upsert 。 至关重要的是,在存在多个事务处理同一个表的情况下,任何方法都必须是安全的-通过使用显式锁定或以其他方式抵御由此产生的竞争条件。 在插入中,关于PostgreSQL上的重复更新,对该主题进行了广泛的讨论,但这是关于MySQL语法的替代方法,并且随着时间的推移,它逐渐形成了许多无关的细节。 我正在努力确定答案。
  • 如何忽略T-SQL(SQL Server)中的“重复键”错误(How to Ignore “Duplicate Key” error in T-SQL (SQL Server))
    问题 我有一个包含多个SQL语句(INSERT,UPDATE和/或DELETES)的事务。 执行时,我想忽略Duplicate Error语句,然后继续执行下一条语句。 最好的方法是什么? 回答1 尽管我对您的重要建议是构造SQL,以便不要尝试重复插入(Philip Kelley的代码段可能就是您所需要的),但我想提一句语句中的错误不一定会导致回滚。 除非XACT_ABORT为ON ,否则遇到错误时,事务将不会自动回滚,除非它严重到足以杀死连接为止。 XACT_ABORT默认为OFF 。 例如,以下sql成功将三个值插入到表中: create table x ( y int not null primary key ) begin transaction insert into x(y) values(1) insert into x(y) values(2) insert into x(y) values(2) insert into x(y) values(3) commit 除非您设置XACT_ABORT ,否则客户端将引发错误并导致回滚。 如果出于某种可怕的原因而无法避免插入重复项,则应该能够将错误捕获到客户端上并忽略它。 回答2 我认为您正在索引上寻找IGNORE_DUP_KEY选项。 请查看http://msdn.microsoft.com/zh-cn/library
  • 获取为ON DUPLICATE KEY UPDATE多次插入而插入的行数?(Getting number of rows inserted for ON DUPLICATE KEY UPDATE multiple insert?)
    问题 我有一个很大的表,其主键为BINARY(20) 。 该表大约有1700万行。 Cron作业每小时都会尝试使用ON_DUPLICATE_KEY_UPDATE语法在此表中插入多达50,000个新条目。 cronjob中的每个插入都具有1,000个值(多个插入)。 如何从此查询中获取插入表中的行数? 我前后都无法进行行计数,因为大约有1700万行,而且查询太昂贵了。 在手册中mysql说,对于插入的行,受影响的行数为1 ,对于更新的字段为2 ,这意味着在我的1000 INSERT ON DUPLICATE KEY UPDATE查询中,我可能影响的行范围为1000-2000,但我没有如何知道从该号码插入了多少条记录? 我该如何克服呢? 谢谢 回答1 插入数将是2000减去受影响的行数。 更普遍: (numberOfValuesInInsert * 2) - mysql_affected_rows() 编辑: 正如tomas所指出的,MySQL文档实际上是这样说的: 使用ON DUPLICATE KEY UPDATE,如果将行作为新行插入,则每行的受影响行值为1;如果更新了现有行,则为2;如果将现有行设置为其当前值,则为0 。 [强调我的] 因此,如果有可能将现有行设置为相同的值,则无法确定更新了多少行与插入了多少行,因为两次插入将与一次具有不同值的更新与一次具有相同值的更新无法区分。
  • 如何更好地复制 SQL Server 中的一组数据(How to better duplicate a set of data in SQL Server)
    问题 我有几个相关的表,我希望能够在更新引用时复制某些行。 我想复制 Table1 中的一行,以及它所有与 Table2 和 Table3 相关的行,我试图找出一种有效的方法来完成它而不是遍历行。 例如,我有一张篮子表: +----------+---------------+ | BasketId | BasketName | +----------+---------------+ | 1 | Home Basket | | 2 | Office Basket | +----------+---------------+ 每个篮子都有水果: +---------+----------+-----------+ | FruitId | BasketId | FruitName | +---------+----------+-----------+ | 1 | 1 | Apple | | 2 | 1 | Orange | | 3 | 2 | Mango | | 4 | 2 | Pear | +---------+----------+-----------+ 每个水果都有一些属性: +------------+---------+--------------+ | PropertyId | FruitId | PropertyText | +------------+------
  • 使用“INSERT ... ON DUPLICATE KEY UPDATE”插入多条记录(Use“ INSERT … ON DUPLICATE KEY UPDATE” to insert multiple records)
    问题 我的表结构 表:标记 我的目标:我想插入或更新具有条件的多条记录 我目前正在通过此查询进行检查 第一步 SELECT * FROM `marks` WHERE `student` =115 AND `param` =1 第二步 if records found by matching above criteria i just update record by my new values else insert new record into my table 它会工作正常。 但我想减少代码并将其优化为单个查询。 它可能与否? 我在 MySQL 文档INSERT ... ON DUPLICATE KEY UPDATE上找到了这个。 如果这是一个解决方案。 我如何通过查询实现? 注意:我使用的是Yii 框架。 也欢迎 Yii 的建议 编辑:此查询不会更新行。 但避免插入正常工作 INSERT INTO marks(`student`,`param,mark`,`created`,`lastmodified`,`status`) VALUES (11,30,10,'00-00-00 00:00:00','00-00-00 00:00:00','U') ON DUPLICATE KEY UPDATE `mark`=VALUES(`mark`) 回答1 查看这篇文章 Yii
  • 如何执行UPSERT,以便在更新部分中可以同时使用新值和旧值(How to Perform an UPSERT so that I can use both new and old values in update part)
    问题 愚蠢但简单的示例:假设我有一个表格“ Item”,其中保存了接收到的项目的总数。 Item_Name Items_In_Stock 项目名称是此处的主键。 每当我收到数量为X的物料A时,如何实现以下目标。 如果该商品不存在,则为商品A插入一个新的摘要,并将库存商品设置为X;如果存在一条记录,其中库存商品为Y,则库存商品的新值为(X + Y) INSERT INTO `item` (`item_name`, items_in_stock) VALUES( 'A', 27) ON DUPLICATE KEY UPDATE `new_items_count` = 27 + (SELECT items_in_stock where item_name = 'A' ) 我的问题是我的实际表中有多个列。 在更新部分中编写多个select语句是一个好主意吗? 我当然可以用代码做到这一点,但是有更好的方法吗? 回答1 如我的评论中所述,您不必进行子选择即可引用导致ON DUPLICATE KEY触发的行。 因此,在您的示例中,您可以使用以下代码: INSERT INTO `item` (`item_name`, items_in_stock) VALUES( 'A', 27) ON DUPLICATE KEY UPDATE `new_items_count` = `new_items
  • oracle sql:如果存在则更新否则插入[重复](oracle sql: update if exists else insert [duplicate])
    问题 这个问题在这里已经有了答案: 10 年前关闭。 可能的重复: Oracle:如何 UPSERT(更新或插入表?) 你好, 我有一个表,如果记录已经存在,则必须在其中修改记录,否则必须插入新记录。 Oracle sql 不接受IF EXISTS ,否则我会做一个if - update - else - insert查询。 我看过MERGE但它只适用于多个表。 我该怎么办? 回答1 MERGE 不需要“多表”,但它确实需要一个查询作为源。 这样的事情应该工作: MERGE INTO mytable d USING (SELECT 1 id, 'x' name from dual) s ON (d.id = s.id) WHEN MATCHED THEN UPDATE SET d.name = s.name WHEN NOT MATCHED THEN INSERT (id, name) VALUES (s.id, s.name); 或者,您可以在 PL/SQL 中执行此操作: BEGIN INSERT INTO mytable (id, name) VALUES (1, 'x'); EXCEPTION WHEN DUP_VAL_ON_INDEX THEN UPDATE mytable SET name = 'x' WHERE id = 1; END; 回答2 merge into
  • CodeIgniter-活动记录插入,如果新的或更新重复(CodeIgniter- active record insert if new or update on duplicate)
    问题 对于给定的键,是否可以在 CodeIgniter 中执行活动记录查询,该查询将更新现有记录(如果已经存在或插入如果不存在)? 我知道这可以通过首先查询找到现有记录来完成,但我正在寻找最有效的方法。 回答1 基本上你要找的可能是这个INSERT ... ON DUPLICATE KEY UPDATE - 前提是你使用 MySQL 并且你的 id 是表上的唯一键。 您必须手动构造查询并传递给$this->db->query()函数,而不是任何内置的活动记录,如 DB Driver 的辅助函数。 例子: $sql = 'INSERT INTO menu_sub (id, name, desc, misc) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE name=VALUES(name), desc=VALUES(desc), misc=VALUES(misc)'; $query = $this->db->query($sql, array( $id, $this->validation->name, $this->validation->desc, $this->validation->misc )); 回答2 如果您使用 Codeigniter 3.0 或更高版本,您可能需要考虑使用“$this->db->replace()”。
  • 在重复密钥更新上与插入相同(On Duplicate Key Update same as insert)
    问题 我已经搜索了一下,但没有找到是否有可能。 我有这个MySQL查询: INSERT INTO table (id,a,b,c,d,e,f,g) VALUES (1,2,3,4,5,6,7,8) 字段ID具有“唯一索引”,因此不能有两个。 现在,如果数据库中已经存在相同的ID,我想对其进行更新。 但是我真的必须再次指定所有这些字段,例如: INSERT INTO table (id,a,b,c,d,e,f,g) VALUES (1,2,3,4,5,6,7,8) ON DUPLICATE KEY UPDATE a=2,b=3,c=4,d=5,e=6,f=7,g=8 或者: INSERT INTO table (id,a,b,c,d,e,f,g) VALUES (1,2,3,4,5,6,7,8) ON DUPLICATE KEY UPDATE a=VALUES(a),b=VALUES(b),c=VALUES(c),d=VALUES(d),e=VALUES(e),f=VALUES(f),g=VALUES(g) 我已经在插入中指定了所有内容... 需要特别说明的是,我想通过变通的方式获取ID! id=LAST_INSERT_ID(id) 我希望有人能告诉我最有效的方法是什么。 回答1 给出了UPDATE语句,以便可以将较旧的字段更新为新值。 如果您的旧值与新值相同
  • 如何用PostgreSQL模拟“插入忽略”和“重复键更新”(SQL合并)?(how to emulate “insert ignore” and “on duplicate key update” (sql merge) with postgresql?)
    问题 某些SQL Server具有一项功能,如果它违反主键/唯一键约束,则跳过INSERT 。 例如,MySQL具有INSERT IGNORE 。 在PostgreSQL中模拟INSERT IGNORE和ON DUPLICATE KEY UPDATE的最佳方法是什么? 回答1 尝试进行更新。 如果它不修改表示该行不存在的任何行,则执行插入操作。 显然,您是在事务内执行此操作的。 当然,如果您不想将多余的代码放在客户端,则可以将其包装在一个函数中。 您还需要一个循环,以解决这种思维中非常罕见的比赛条件。 文档中有一个示例:http://www.postgresql.org/docs/9.3/static/plpgsql-control-structures.html,示例40-2位于底部。 这通常是最简单的方法。 您可以使用规则来做一些魔术,但是可能会变得更加混乱。 我建议在这一天中使用函数内包装方法。 这适用于单行或几行值。 如果您要处理例如来自子查询的大量行,则最好将其拆分为两个查询,一个查询用于INSERT,一个查询用于UPDATE(当然,作为适当的联接/子选择-无需编写主查询过滤两次) 回答2 在PostgreSQL 9.5中,这现在是本机功能(就像MySQL已经使用了几年): 插入...冲突时不做/更新(“ UPSERT”) 9.5带来了对“ UPSERT”操作的支持。
  • ANSI SQL 问题 - 如何插入或更新已存在的记录?(ANSI SQL question - how to insert or update a record if it already exists?)
    问题 尽管我正在使用 mySQL(目前),但我不想要任何特定于数据库的 SQL。 如果不存在,我试图插入记录,如果存在则更新字段。 我想使用 ANSI SQL。 该表看起来像这样: create table test_table (id int, name varchar(16), weight double) ; //test data insert into test_table (id, name, weight) values(1,'homer', 900); insert into test_table (id, name, weight) values(2,'marge', 85); insert into test_table (id, name, weight) values(3,'bart', 25); insert into test_table (id, name, weight) values(4,'lisa', 15); If the record exists, I want to update the weight (increase by say 10) 回答1 长期以来,此操作需要两个单独的命令以及一些框架来处理它。 因此名称为 UPSERT(更新或插入)。 但是某些类型的 DBMS 的更新版本支持更优雅的解决方案。 ANSI 标准定义了
  • 等效于SQL Server中的MySQL ON DUPLICATE KEY UPDATE(Equivalent of MySQL ON DUPLICATE KEY UPDATE in Sql Server)
    问题 我正在尝试在Sql Server(2012)中找到以下MySql查询的等效项? INSERT INTO mytable (COL_A, COL_B, COL_C, COL_D) VALUES ( 'VAL_A','VAL_B', 'VAL_C', 'VAL_D') ON DUPLICATE KEY UPDATE COL_D= VALUES(COL_D); 有人可以帮忙吗? PS。 我读过MERGE查询具有相似的功能,但是我发现它的语法非常不同。 回答1 您基本上是在寻找有时称为Upsert的“插入”或“更新”模式。 我建议这样做:Sql Server的插入或更新模式-Sam Saffron 对于将要处理单行的过程,这些事务都可以很好地工作: Sam Saffron的第一个解决方案(适用于此架构): begin tran if exists ( select * from mytable with (updlock,serializable) where col_a = @val_a and col_b = @val_b and col_c = @val_c ) begin update mytable set col_d = @val_d where col_a = @val_a and col_b = @val_b and col_c = @val_c; end else
  • MySQL中的多个更新(Multiple Updates in MySQL)
    问题 我知道您可以一次插入多行,有没有办法在MySQL中一次更新多行(就像在一个查询中一样)? 编辑:例如,我有以下内容 Name id Col1 Col2 Row1 1 6 1 Row2 2 2 3 Row3 3 9 5 Row4 4 16 8 我想将以下所有更新合并到一个查询中 UPDATE table SET Col1 = 1 WHERE id = 1; UPDATE table SET Col1 = 2 WHERE id = 2; UPDATE table SET Col2 = 3 WHERE id = 3; UPDATE table SET Col1 = 10 WHERE id = 4; UPDATE table SET Col2 = 12 WHERE id = 4; 回答1 是的,这是可能的-您可以在重复键更新中使用INSERT...。 使用您的示例: INSERT INTO table (id,Col1,Col2) VALUES (1,1,1),(2,2,3),(3,9,3),(4,10,12) ON DUPLICATE KEY UPDATE Col1=VALUES(Col1),Col2=VALUES(Col2); 回答2 由于您具有动态值,因此需要对要更新的列使用IF或CASE。 它有点难看,但它应该可以工作。 使用您的示例,您可以这样做: UPDATE table