使用存储过程求和、分组并插入到另一个表中

dsekswqp  于 2021-07-27  发布在  Java
关注(0)|答案(2)|浏览(325)

我创建了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列分组,并将总计汇总到一行。
我在这里做错了什么,或者在查询中遗漏了什么?
谢谢。

nc1teljy

nc1teljy1#

对于 on duplicate key 语法要按预期工作,您需要在目标表上设置一个unique或primary key约束,以便数据库能够识别“重复”行。同样的道理 REPLACE 语法。
但是你的 stock 表没有主键。请考虑以下ddl:

CREATE TABLE stock(
    item     int(11) primary key,
    total    int(11) not null
);

旁注:不需要重新指定列 itemon duplicate key 从句,因为它首先是用来识别冲突的。这就足够了:

INSERT INTO STOCK(item, total) 
SELECT s_item, SUM(s_qty) FROM shop GROUP BY s_item
ON DUPLICATE KEY UPDATE total = VALUES(total);
lc8prwob

lc8prwob2#

如果您只运行一次,它应该会像您预期的那样工作。但随后的运行可能会带来重复 ITEM 因为@gmb所说的。这张table必须有一张table UNIQUE index 或者 PRIMARY KEY . 请在此处查看更多详细信息
https://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html

相关问题