MySQL INSERT仅在行不存在时才使用,否则选择重复行

时间:2010-06-20 10:28:37

标签: mysql insert primary-key unique-key

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

2 个答案:

答案 0 :(得分:1)

至少在理论上,这应该适合你:

首先扩展您的表,以获得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)或现有行(如果是UPDATE)
SELECT LAST_INSERT_ID()

答案 1 :(得分:0)

这应该在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

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