例如:
**table 1**
name gender email
hemanth m test@gmail.com
rajesh m rajesh@gmail.com
kumar m kumar@gmail.com
**table 2***
name gender email
hemanthsai m testing@gmail.com
rajesh m rajesh@gmail.com
kumaras f kumaras@gmail.com
**expected result in table 1***
name gender email
hemanthsai m testing@gmail.com
rajesh m rajesh@gmail.com
kumaras f kumaras@gmail.com
这只是一个例子,实际上我必须在MySQL中一次更新许多列的所有数据
我尝试的是
INSERT INTO table1 (NAME,gender, email) VALUES(?, ?, ?), (?, ?, ?)
ON DUPLICATE KEY UPDATE SET *; ### this didn""t worked ###
我需要这样的东西:
INSERT INTO table1 * ON DUPLICATE KEY UPDATE SET *;
如果这不起作用,那么我想到使用另一个表删除一个表上的公共值,然后将剩余的值插入到已删除的表中,所以我需要查询以基于另一个表删除一个表上的公共值。
提前感谢,
创建另一个表:
CREATE TABLE table3 (
name VARCHAR(50),
gender VARCHAR(50),
email VARCHAR(50));
在新表上创建唯一索引:
CREATE UNIQUE INDEX index_name
ON table3 (name, gender, email);
从表1和表2中INSERT IGNORE
:
INSERT IGNORE INTO table3 SELECT * FROM table1;
INSERT IGNORE INTO table3 SELECT * FROM table2;
检查您的table3
,它应该不再有任何重复项。
演示
P/S:如果您只想检查重复的电子邮件 - 并允许同一用户拥有多封电子邮件,则可以跳过创建唯一索引并将email
列作为PRIMARY KEY
table3
。
你试过INSERT INTO SELECT
吗?
例:
INSERT INTO `table1`
(`name`, `gender`, `email`)
SELECT t2.`name`, t2.`gender`, t2.`email`
FROM `table2` AS t2
ON DUPLICATE KEY UPDATE
`name`= t2.`name`,`gender` = t2.`gender`, `email` = t2.`email`
您还需要有一个在表 1 和 table2 之间通用的唯一键。我认为情况确实如此。
编辑
考虑到您的评论,您正在寻找的可能是REPLACE INTO
.
REPLACE INTO `table1`
SELECT *
FROM `table2`
请注意,此操作不会更新旧值,但实际上会删除它们。这意味着如果PRIMARY_KEY
具有例如auto_increment()
,则可以替换该。 另请注意,这是一项繁重的操作,因为每次删除操作都需要对表重新编制索引。
您可以在此处阅读有关它的更多信息:http://code.openark.org/blog/mysql/replace-into-think-twice
就个人而言,即使有很多列,我也会使用INSERT INTO