各位大家好。
我做了一个使用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
我不知道我的查询有什么问题。
请帮助我。
谢谢!
答案 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
的组合 - 从数据样本中不清楚。