我需要创建一个查询来插入一些记录,记录必须是唯一的。如果存在,我需要记录的ID否则如果它不存在我想插入它并获得新的ID。我写了这个查询,但它不起作用。只有当记录不存在时才插入记录
SELECT id FROM tags WHERE slug = 'category_x'
WHERE NO EXISTS (INSERT INTO tags('name', 'slug') VALUES('Category X','category_x'));
我需要创建一个查询来插入一些记录,记录必须是唯一的。如果存在,我需要记录的ID否则如果它不存在我想插入它并获得新的ID。我写了这个查询,但它不起作用。只有当记录不存在时才插入记录
SELECT id FROM tags WHERE slug = 'category_x'
WHERE NO EXISTS (INSERT INTO tags('name', 'slug') VALUES('Category X','category_x'));
它被称为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
对于UPSERT而言,类似于关闭的声音... ANSI应该将此包括到ANSI SQL标准.. –
尝试类似...
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,无论插入的...
BEGIN ... END语法只能用于存储过程,函数,触发器结束事件(MySQL 5.6)请参阅http://dev.mysql.com/doc/refman/5.6/en/begin-end html的 –
MySQL有很好的REPLACE
。它很容易使用,并记住它的语法与INSERT
相同。 在你的情况下,只需运行下面的查询。
REPLACE INTO tags('name', 'slug') VALUES('Category X','category_x')
它在没有唯一约束违规时就像INSERT一样工作。如果在PK或UNIQUE键上找到重复值,则其他列将使用给定值进行更新。它由DELETE复制记录和INSERT新记录完成。
无法真正理解您尝试尝试的内容。你的ID是一个auto_increment主键吗? –
从一个来自应用程序的查询中选择一个id是不好的,并且可能/会在长时间运行时导致竞争条件.. –