我创建了3个表: item
, shop
以及 stock
. 加上一个名为 inserting
插入到 shop
表中的给定项 item
table
CREATE TABLE item(
i_id int(11) auto_increment,
i_name varchar(255) not null,
primary key(i_id));
CREATE TABLE shop(
s_id int(11) auto_increment,
s_name varchar(255) not null,
s_item int(11) not null,
s_qty int(11) not null,
primary key(s_id),
foreign key(s_item) references item(i_id)
);
CREATE TABLE stock(
item int(11) not null,
total int(11) not null
);
CREATE PROCEDURE inserting (
IN shop_name varchar(225),
IN shop_item int(11),
IN shop_qty int(11)
)
BEGIN
INSERT INTO shop(s_name, s_item, s_qty)
VALUES
(shop_name, shop_item, shop_qty);
INSERT INTO STOCK(item, total)
SELECT s_item, SUM(s_qty) FROM shop GROUP BY s_item
ON DUPLICATE KEY UPDATE
item = VALUES(item),
total = VALUES(total);
第一个insert有效,但在第二个insert填充 stock
表它给了我额外的列,这是我不期望的。
我尝试使用replace-into和on-duplicate-key-update来获得单个结果,但结果如下:
SELECT * FROM `stock`;
+------+-------+
| ITEM | TOTAL |
+------+-------+
| 1 | 5 |
| 1 | 9 |
+------+-------+
我试图实现的是,将item列分组,并将总计汇总到一行。
我在这里做错了什么,或者在查询中遗漏了什么?
谢谢。
2条答案
按热度按时间nc1teljy1#
对于
on duplicate key
语法要按预期工作,您需要在目标表上设置一个unique或primary key约束,以便数据库能够识别“重复”行。同样的道理REPLACE
语法。但是你的
stock
表没有主键。请考虑以下ddl:旁注:不需要重新指定列
item
在on duplicate key
从句,因为它首先是用来识别冲突的。这就足够了:lc8prwob2#
如果您只运行一次,它应该会像您预期的那样工作。但随后的运行可能会带来重复
ITEM
因为@gmb所说的。这张table必须有一张tableUNIQUE index
或者PRIMARY KEY
. 请在此处查看更多详细信息https://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html