0

我有一个 mysql 数据库,其中包含一个表,该表同时具有自动增量主键和唯一字符串值键(sha-1 哈希)。

如果我尝试添加与现有记录具有相同 sha-1 哈希的记录,我只想获取现有记录的主键。在尝试插入具有现有哈希值的记录时,我可以使用“INSERT ... ON DUPLICATE KEY UPDATE”或“INSERT IGNORE”之类的东西来防止异常。

但是,发生这种情况时,我需要检索现有记录的主键。我找不到使用单个 SQL 语句的方法。如果重要的话,我的代码是用 Java 编写的,而且我使用的是 JDBC。

或者,我可以使用两个语句来完成(如果未找到,则查询后跟插入,或者如果存在重复键,则插入后跟查询)。但我认为单个语句会更有效。

4

2 回答 2

2

如果我尝试添加与现有记录具有相同 sha-1 哈希的记录,我只想获取现有记录的主键。在尝试插入具有现有哈希值的记录时,我可以使用“INSERT ... ON DUPLICATE KEY UPDATE”或“INSERT IGNORE”之类的东西来防止异常。

如果您UNIQUE在列上有索引,无论您尝试什么,RDMS 都不允许该列中有重复项(NULL值除外)。

如您所说,如果附加此内容,则有防止“错误”的解决方案。可能INSERT IGNORE在你的情况下。

反正,INSERT修改UPDATE数据库。MySQL从不返回这些语句的值。读取数据库的唯一方法是使用SELECT语句。


这里的“解决方法”很简单,因为您有一个UNIQUE列:

INSERT IGNORE INTO tbl (pk, sha_key) VALUES ( ... ), ( ... );
SELECT pk, sha_key FROM tbl WHERE sha_key IN ( ... );
--                                             ^^^
--             Here the list of the sha1 keys you *tried* to insert
于 2013-08-08T14:27:07.617 回答
0

实际上, INSERT...ON DUPLICATE KEY UPDATE 正是在您的情况下使用的正确语句。当您使用 ON DUPLICATE 时,如果插入没有重复,则 JDBC 返回计数 1 和新插入行的 ID。如果所采取的操作是由于重复而导致的更新,则 JDBC 将返回计数 2 以及原始行的 ID 和新生成的 ID,即使新 ID 从未实际插入到表中。

您可以通过调用 PreparedStatement.getGeneratedKeys() 获得正确的密钥。第一个键几乎总是你感兴趣的那个。对于这个声明:

INSERT INTO table (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE c=3;

您可以通过调用以下方式获取插入或更新的 ID:

Long key;
ResultSet keys = preparedStatement.getGeneratedKeys();
if (keys.next())
    key = keys.getLong("GENERATED_KEY");
于 2013-12-06T17:46:28.720 回答