如何制作 mysql 批量更新存储过程?
how can i make a mysql batch update stored procedure?
所以我想创建一个存储过程来更新一批行。我通常通过在后面的代码中循环存储过程来执行此操作,但这会降低性能。我的问题是如何将参数传递给查询,因为要更改的总行数各不相同。
这是我的单行更新存储过程,如何将其转换为处理多于 1 行以及如何将这些行作为参数传递?
DROP PROCEDURE IF EXISTS EditProductType;
DELIMITER $$
CREATE PROCEDURE EditProductType(
IN productTypeId INT,
IN NAME VARCHAR(100),
IN details VARCHAR(1000)
)
BEGIN
UPDATE product_types pt
SET pt.name = NAME,
pt.details = details
WHERE pt.productTypeId = productTypeId;
END$$
DELIMITER ;
一次 UPDATE
多行是不切实际的,除非
WHERE
子句引用多行(没有任何变化)
或
- 你有一个 table 的变化,你使用 table
UPDATE
JOINs
你的 table 和 table.
IODKU
我认为这是一个丑陋的解决方案,但无论如何我都会提出来。
INSERT INTO t (id,b,c)
VALUES
(10,'doohickie',3),
(22,'whatchamacallit',44),
(98,'doodad',55),
(34,'thingamabob',56)
ON DUPLICATE KEY UPDATE
b = VALUES(b),
c = VALUES(c) ;
假设:
id
是 PRIMARY KEY
(或 UNIQUE
键)。
- 您指定的行已经存在;这样,IODKU 的
INSERT
一半就不会被使用,只使用 UPDATE
一半。
如果您在 table temp
中已经有 id,b,c
,这会有效(可能更好):
INSERT INTO t (id,b,c)
SELECT id,b,c FROM temp
ON DUPLICATE KEY UPDATE
b = VALUES(b),
c = VALUES(c) ;
所以我想创建一个存储过程来更新一批行。我通常通过在后面的代码中循环存储过程来执行此操作,但这会降低性能。我的问题是如何将参数传递给查询,因为要更改的总行数各不相同。
这是我的单行更新存储过程,如何将其转换为处理多于 1 行以及如何将这些行作为参数传递?
DROP PROCEDURE IF EXISTS EditProductType;
DELIMITER $$
CREATE PROCEDURE EditProductType(
IN productTypeId INT,
IN NAME VARCHAR(100),
IN details VARCHAR(1000)
)
BEGIN
UPDATE product_types pt
SET pt.name = NAME,
pt.details = details
WHERE pt.productTypeId = productTypeId;
END$$
DELIMITER ;
一次 UPDATE
多行是不切实际的,除非
WHERE
子句引用多行(没有任何变化)
或
- 你有一个 table 的变化,你使用 table
UPDATE
JOINs
你的 table 和 table.
IODKU
我认为这是一个丑陋的解决方案,但无论如何我都会提出来。
INSERT INTO t (id,b,c)
VALUES
(10,'doohickie',3),
(22,'whatchamacallit',44),
(98,'doodad',55),
(34,'thingamabob',56)
ON DUPLICATE KEY UPDATE
b = VALUES(b),
c = VALUES(c) ;
假设:
id
是PRIMARY KEY
(或UNIQUE
键)。- 您指定的行已经存在;这样,IODKU 的
INSERT
一半就不会被使用,只使用UPDATE
一半。
如果您在 table temp
中已经有 id,b,c
,这会有效(可能更好):
INSERT INTO t (id,b,c)
SELECT id,b,c FROM temp
ON DUPLICATE KEY UPDATE
b = VALUES(b),
c = VALUES(c) ;