当前位置: 首页 > 知识库问答 >
问题:

MYSQL:插入具有重复唯一密钥的记录时获取现有主键?

欧阳昊焱
2023-03-14

我有一个mysql数据库,它的表既有一个自动递增的主键,也有一个唯一的字符串值键(sha-1散列)。

如果我尝试添加一个与现有记录具有相同sha-1哈希的记录,我只想获取现有记录的主键。我可以使用“在重复密钥更新时插入…”或“插入忽略”之类的方法来防止在尝试插入具有现有哈希值的记录时出现异常。

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

或者,我可以使用两个语句(如果找不到,则在查询之后插入,如果存在重复的键,则在插入之后插入查询)。但是我认为一个单独的声明会更有效。

共有2个答案

师腾
2023-03-14

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

您可以通过调用准备tatement.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");
南宫胡媚
2023-03-14

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

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

正如您所说的,有一个解决方案可以防止“错误”的发生。在您的案例中,可能是插入忽略。

无论如何,插入更新修改数据库。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
 类似资料:
  • 在使用Postgresql的Rails4.2中,我在尝试保存新的ActiveRecord对象时遇到了这个错误 PG::UniqueViolation:错误:重复键值违反唯一约束“My_table_name_pkey” 它看起来像是试图用已经存在的主键将记录插入到表中。我该怎么解决这个问题?

  • 问题内容: 我需要从下面给出的表中获取每个重复记录集的第一行。我需要在视图中使用此查询 请不要使用临时表,因为我已经通过添加标识列和最小函数以及分组依据来完成了。我需要没有临时表或表变量的解决方案 这只是示例数据。原始表中有1000条记录,我只需要前1000条的结果,因此不能使用 不同的 我正在使用SQL Server 2005 谢谢。 问题答案: 答案具体取决于您所说的“前1000个不同”记录的

  • 好的,这个问题不是关于如何返回ID,而是更像是如何跳过它...我有一种情况,我使用last_insert_id()获取最后插入的行的id,但如果没有插入行,我希望得到一个零。问题如下: I INSERT...UPDATE一些记录:由于行是新插入的,因此返回所有ID 然后重复这个过程:这一次不返回ID。耶!这正是我想要的 我更改了一个列值并重复该过程:但现在返回了我更改了列值的行的ID。这让我很生气

  • 问题内容: 我有一个带有唯一主键列的表。有时,当我执行查询时会收到错误消息,因为该值已被使用。 我可以使用和捕获此特定错误吗? 问题答案: 看起来mysql为重复的主键抛出了1062错误代码。您可以检查sql异常的错误代码: 注意,这种方法不是跨数据库供应商的,因为不同的供应商对于重复的PK可能具有不同的错误代码。

  • 我正在使用Postgres,我有一个具有唯一键(memberId,propertyName)的表。我使用的是onDuplicateKey,生成的代码显示它使用的是on conflict,但它使用的是id。是否可以指定您自己的键来检查,或者Jooq是否尝试读取表并检查是否存在唯一约束?我目前的解决方法是先进行选择,然后进行更新或插入。

  • 问题内容: 好的,可以说我正在对一个表进行mysql操作,并且该表的列设置为和。 如何获得查询以在同一查询中输出新生成的主键的值? 目前,我正在运行第二个查询来检索ID,但是考虑到这可能会产生错误的结果,这似乎不是一种好习惯。 如果这不可能,那么确保我检索正确ID的最佳实践是什么? 问题答案: 您需要使用以下功能:http : //dev.mysql.com/doc/refman/5.0/zh-