在MySql上我的INSERT~SELECT~ON DUPLICATE KEY查询出了什么问题?

时间:2016-12-10 15:35:53

标签: mysql duplicates mariadb


各位大家好。

我做了一个使用INSERT .. UPDATE .. ON DUPLICATE的查询。

但是我所做的查询没有用,因为语法问题而且我不知道为什么!

这是我试图做的事情。

我尝试做的是为每个帐户提供三个'magic_potion'。

首先,我制作了两张桌子。

CREATE TABLE account(
    account_no INT AUTO_INCREMENT,
    account_id VARCHAR(32) NOT NULL,
    account_pw VARCHAR(40) NOT NULL,
    PRIMARY KEY(account_no)
);

CREATE TABLE item(
    item_no INT AUTO_INCREMENT,
    account_id VARCHAR(32) NOT NULL,
    item_name VARCHAR(32) NOT NULL,
    item_count SMALLINT NOT NULL,
    item_status SMALLINT NOT NULL,
    PRIMARY KEY(item_no)
);

其次,我把三个帐号用于测试。

INSERT INTO account (account_id, account_pw) VALUES ('James', MD5('James')), ('Andy', MD5('James')), ('Angela', MD5('James'));

第三,我为每个帐户提供了magic_potion。

INSERT
INTO    item
SELECT  NULL, A.account_id, item_name, item_count, item_status
FROM    account A
        CROSS JOIN (SELECT 'magic_potion' AS item_name, 3 AS item_count, 1 AS item_status) B;
第四,我换了另一个帐号。

INSERT INTO account (account_id, account_pw) VALUES ('Judy', MD5('Judy')), ('Tom', MD5('Tom'));

第五,现在,我想给新添加的帐户提供(= INSERT)两个'magic_potion',并希望将('UPDATE)一个'magic_potion'添加到以前的帐户。所以我在下面查询。

INSERT
INTO    item
SELECT  NULL, A.account_id, item_name, item_count, item_status
FROM    account A
        CROSS JOIN (SELECT 'magic_potion' AS item_name, 3 AS item_count, 1 AS item_status) B
ON DUPLICATE KEY UPDATE item_name = 'magic_potion', item_count = item_count + 1, item_status = 1;

但是这个查询不起作用。系统消息说,

Error code: 1064
You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'KEY UPDATE item_name = 'magic_potion', item_count = item_count + 1, item_status ' at line 6

我不知道我的查询有什么问题。

请帮助我。

谢谢!

1 个答案:

答案 0 :(得分:1)

语法错误很简单 - [CROSS] JOIN可以使用可选的ON子句,因此解析器认为ON DUPLICATE ...就是这样一个子句。要避免语法错误,您需要将SELECT括在括号中:

INSERT
INTO    item (
   SELECT  NULL, A.account_id, item_name, item_count, item_status
   FROM    account A
        CROSS JOIN (SELECT 'magic_potion' AS item_name, 3 AS item_count, 1 AS item_status) B
) ON DUPLICATE KEY UPDATE item_name = 'magic_potion', item_count = item_count + 1, item_status = 1;

对于备注,此处CROSS是多余的。

然后你会遇到一个上下文问题(模棱两可item_count)。您还不需要解决它,因为查询将无法完成您的预期。它永远不会到达ON DUPLICATE KEY UPDATE子句,因为您唯一的唯一键是主键item_no,并且您正在将NULL插入其中,这意味着它将始终通过自动增量生成 - 也就是说,每次都会继续插入行。

对此有不同的解决方案,具体取决于您想要实现的目标 - 您可以修改查询,或者您可以在该表中应该唯一的字段或组合上添加UNIQUE KEY(也许它是account_id,或者它可能是account_id + item_name的组合 - 从数据样本中不清楚。