2013-11-22 100 views
0

我需要创建一个查询来插入一些记录,记录必须是唯一的。如果存在,我需要记录的ID否则如果它不存在我想插入它并获得新的ID。我写了这个查询,但它不起作用。只有当记录不存在时才插入记录

SELECT id FROM tags WHERE slug = 'category_x' 
WHERE NO EXISTS (INSERT INTO tags('name', 'slug') VALUES('Category X','category_x')); 
+0

无法真正理解您尝试尝试的内容。你的ID是一个auto_increment主键吗? –

+0

从一个来自应用程序的查询中选择一个id是不好的,并且可能/会在长时间运行时导致竞争条件.. –

回答

2

它被称为UPSERT(即UPdate或inSERT)。

INSERT INTO tags 
('name', 'slug') 
VALUES('Category X','category_x') 
ON DUPLICATE KEY UPDATE 
'slug' = 'category_x' 

MySql参考:13.2.5.3。INSERT ... ON DUPLICATE KEY UPDATE Syntax

+0

对于UPSERT而言,类似于关闭的声音... ANSI应该将此包括到ANSI SQL标准.. –

1

尝试类似...

IF (NOT EXISTS (SELECT id FROM tags WHERE slug = 'category_x')) 
BEGIN 
    INSERT INTO tags('name', 'slug') VALUES('Category X','category_x'); 
END 
ELSE 
BEGIN 
    SELECT id FROM tags WHERE slug = 'category_x' 
END 

但你可以离开ELSE部分,选择ID,这样的查询将始终返回ID,无论插入的...

+0

BEGIN ... END语法只能用于存储过程,函数,触发器结束事件(MySQL 5.6)请参阅http://dev.mysql.com/doc/refman/5.6/en/begin-end html的 –

0

MySQL有很好的REPLACE。它很容易使用,并记住它的语法与INSERT相同。 在你的情况下,只需运行下面的查询。

REPLACE INTO tags('name', 'slug') VALUES('Category X','category_x') 

它在没有唯一约束违规时就像INSERT一样工作。如果在PK或UNIQUE键上找到重复值,则其他列将使用给定值进行更新。它由DELETE复制记录和INSERT新记录完成。

相关问题