mysql插入忽略。只需要获取所有插入的行

时间:2016-02-07 09:01:52

标签: mysql

大家好!我有带有表格的MySQL数据库

CREATE TABLE `TableWithInnoDBEngine` (  
`userID` int(11) NOT NULL,  PRIMARY KEY (`userID`),   
UNIQUE KEY `userID_UNIQUE` (`userID`) ) 
ENGINE=InnoDB  DEFAULT CHARSET=utf8;

mysql> select * from TableWithInnoDBEngine;
 +--------+
 | userID |
 +--------+
 |      1 |
 |      2 |
 |      3 |
 +--------+

我在做:

INSERT IGNORE INTO TableWithInnoDBEngine (UserID) VALUES (1),(2),(3),(4),(5);


2 row(s) affected Records: 5  Duplicates: 3  Warnings: 0

想要获得所有受影响的行?

SELECT LAST_INSERT_ID()仅返回最后一个值(5),但需要返回

 +--------+
 | userID |
 +--------+
 |      4 |
 |      5 |
 +--------+

我正在使用PHP 5.6.17 + MySQL 5.5.46-0+deb7u1

感谢您的回复!

3 个答案:

答案 0 :(得分:0)

我会创建一个类似于目标表的临时表,在那里插入所有id-s,然后你可以进行2次选择,一次选择重复项,一次将非重复项插入表中。

我不明白你问题的第二部分:从1到35000插入所有id-s,并获得重复项?它相当于:

SELECT DISTINCT userId FROM table;

更新

当你这样做时:

$mysqli->query("INSERT IGNORE INTO TableWithInnoDBEngine (UserID) VALUES (1),(2),(3),(4),(5)");
$info = $mysqli->info();

您可以使用字符串格式获取所需信息,例如“Records: 3 Duplicates: 0 Warnings: 0”,请参阅:http://php.net/manual/en/mysqli.info.php

答案 1 :(得分:0)

似乎内存使用解决方案的快速和廉价是将新数据插入临时表并将其与原始表进行比较:

CREATE TABLE `Original_TableWithInnoDBEngine` (
  `userID` int(11) NOT NULL,
  UNIQUE KEY `userID_UNIQUE` (`userID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `tmp_TableWithInnoDBEngine` (
  `userID` int(11) NOT NULL,
  UNIQUE KEY `userID_UNIQUE` (`userID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

然后:

INSERT INTO Original_TableWithInnoDBEngine (userID) VALUES (1),(2),(3),(4),(5),(6);
select * from Original_TableWithInnoDBEngine;
+--------+
| userID |
+--------+
|      1 |
|      2 |
|      3 |
|      4 |
|      5 |
|      6 |
+--------+

INSERT INTO tmp_TableWithInnoDBEngine (userID) VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
select * from tmp_TableWithInnoDBEngine;
+--------+
| userID |
+--------+
|      1 |
|      2 |
|      3 |
|      4 |
|      5 |
|      6 |
|      7 |
|      8 |
|      9 |
|     10 |
+--------+

现在我使用此查询来获取tmp表中但不是原始值的值:

SELECT tmp_TableWithInnoDBEngine.UserID FROM tmp_TableWithInnoDBEngine WHERE tmp_TableWithInnoDBEngine.UserID NOT IN(SELECT UserID FROM original_TableWithInnoDBEngine)";

+--------+
| userID |
+--------+
|      7 |
|      8 |
|      9 |
|     10 |
+--------+

答案 2 :(得分:0)

如果您使用/usr/lib/jvm/java-8-oracle/bin/java而不是INSERT ... ON DUPLICATE KEY UPDATE ...,则可以将所有重复的ID保存到一个字符串中,执行以下操作:

INSERT IGNORE ...

您现在可以解析应用程序端的结果字符串,以过滤插入的数据。