MySql在选择不起作用的情况下插入ON Duplicate Key

时间:2014-10-07 13:42:19

标签: mysql sql

如何在插入内部使用select for duplicate duplicate update part?

我认为这样,但事实并非如此。然而,选择部分可以自行运行。

insert into tags (tag) values ('sony') ON DUPLICATE KEY UPDATE total = (
    select count(*) from items where FIND_IN_SET(tag, tags)
) WHERE tag IN ('sony');

"id"    "tags"                  "category"
"1"     "sony,pioneer,philips"  "1"
"2"     "sony,pioneer"          "1"
"3"     "sony"                  "1"
"4"     "bose,sony"             "1"
"5"     "bose"                  "1"
"6"     "bose"                  "1"

代码

"id"    "tag"       "total" "category"
"1"     "sony"      "0"     "1"
"2"     "pioneer"   "0"     "1"
"3"     "philips"   "0"     "1"
"4"     "bose"      "0"     "0"

3 个答案:

答案 0 :(得分:0)

尝试修复括号:

insert into tags(tag)
    values ('sony')
    ON DUPLICATE KEY UPDATE total = (select count(*)
                                     from items
                                     where FIND_IN_SET(tag, tags) and
                                           tag IN ('sony')
                                     );

最后的where子句应该导致语法错误。

编辑:

如果您想要insert中的值,可以尝试:

insert into tags(tag)
    values ('sony')
    ON DUPLICATE KEY UPDATE total = (select count(*)
                                     from items
                                     where FIND_IN_SET(VALUES(tag), tags) 
                                    );

我没有在子查询中尝试过这个,但VALUES()在表达式中起作用。

答案 1 :(得分:0)

INSERT INTO tags (tag)
  VALUES ('sony')
ON DUPLICATE KEY UPDATE
  total = (
    SELECT COUNT(*)
    FROM items
    WHERE FIND_IN_SET('sony', tags)
  )

条件tag IN ('sony')不是必需的,因为ON DUPLICATE KEY UPDATE更新了行,tag = 'sony' - 因为此行报告重复。

答案 2 :(得分:0)

我从未在INSERT ... ON DUPLICATE KEY语句中使用子查询作为表达式。 (如果这是有效的,那么Rimas的答案中的模式,或者Gordon的第二个例子中的模式,将是你想要的。)


我觉得奇怪的是,仅在UPDATE操作中为total列分配了值,而不是INSERT操作。

就个人而言,我更倾向于将一个值分配给INSERT上的total列。我会做这样的事情:

INSERT INTO tags (tag,total)
SELECT 'sony', (SELECT COUNT(*) FROM items i WHERE FIND_IN_SET('sony',i.tags))
ON DUPLICATE KEY UPDATE total = VALUES(total)