MySQL 仅当行不存在时插入,否则选择重复行

发布于 2024-09-06 11:59:57 字数 73 浏览 7 评论 0原文

我正在寻找一条语句,该语句将尝试将一行插入表中,但如果遇到重复行,则返回重复行的主键。表中的一个字段是自增主键,另一个字段是唯一的。

I am looking for a statement that will try to insert a row into a table, but return the primary key of the duplicate row if one is encountered. One field in the table is the auto incrementing primary key, the other is unique.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

迷迭香的记忆 2024-09-13 11:59:57

至少在理论上,这应该对您有用:

首先扩展您的表以添加一个tinyint类型的附加列虚拟。然后,您可以在插入/更新时使用以下查询:(

INSERT INTO yourtable (a, b) VALUES (1, 2) ON DUPLICATE KEY UPDATE id  = LAST_INSERT_ID(id), dummy = NOT dummy

我假设 a 列具有唯一索引,并且存在 a=1 的行。)

然后您可以获得新行的 ID(如果是INSERT)或现有行(在更新的情况下)通过

SELECT LAST_INSERT_ID()

This should, at least in theory, work for you:

First extend your table to have an additional column dummy of type tinyint. Then you can use the following query when inserting/updating:

INSERT INTO yourtable (a, b) VALUES (1, 2) ON DUPLICATE KEY UPDATE id  = LAST_INSERT_ID(id), dummy = NOT dummy

(I'm assuming here that the column a has a unique index and a row with a=1 exists.)

You can then get the ID of the new row (in case of an INSERT) or the existing row (in case of an UPDATE) via

SELECT LAST_INSERT_ID()
情话难免假 2024-09-13 11:59:57

这应该在 DB2 中起作用,不知道在 MySQL 中是否有效,或者是否有特殊的 MySQL 语法:

SELECT pk, 'inserted' FROM FINAL TABLE (
  INSERT INTO table (Col1)
  SELECT Val1
  FROM table
  WHERE col1 != Val1
  FETCH FIRST ROW ONLY
)
UNION 
SELECT pk, 'existing'
FROM table
WHERE col1 = val1

这里的想法是当表中没有唯一值时从表中选择一行,插入新值并返回从表中生成的主键。然后,如果表中已存在唯一值,则将其与返回相应键的选择相结合。这些语句中只有一个应该返回一行,第二列指示主键是新的还是现有的。

This should work in DB2, dont know if it will in MySQL or if there is special MySQL syntax for it:

SELECT pk, 'inserted' FROM FINAL TABLE (
  INSERT INTO table (Col1)
  SELECT Val1
  FROM table
  WHERE col1 != Val1
  FETCH FIRST ROW ONLY
)
UNION 
SELECT pk, 'existing'
FROM table
WHERE col1 = val1

The idea here is to select one row from the table when there is not a unique value in there, inserting the new value and returning the generated primary key from the table. This is then combined with the select that returns the corresponding key if the unique values is already in the table. Only one of those statements should return a row, the second column indicating if the primary key is new or exisiting.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文