У меня есть три таблицы продукта, размеры и product_size
product
> id
> name
product_size
> product_id FK
> size_id FK
size
> id
> name
Знайте, используя процедуру хранения. Я хочу вставить один продукт с размерами, например.
product.id =1;
product.name = xyz;
{
product_size.product_id = 1
product_size.size_id = 1
product_size.product_id = 1
product_size.size_id = 2
product_size.product_id = 1
product_size.size_id = 3
}
Итак, как передать размер параметра для хранения процедуры в mysql
Ниже приведена хранимая процедура, которая вставляет одну запись в product_size каждый раз, когда вы вызываете процедуру. Процедура принимает входные параметры для product.id и size.id.
DELIMITER //
CREATE PROCEDURE INSERT_product_size(
IN productID int,
IN sizeID int
)
BEGIN
INSERT INTO
product_size
(product_id, size_id)
VALUES
(productID, sizeID);
END //
DELIMITER ;
Эта процедура принимает идентификатор одного продукта и "массив" идентификатора размера (в виде строки с разделителями-запятыми) и вставляет все размеры для продукта в один вызов процедуры:
DROP PROCEDURE IF EXISTS INSERT_product_sizes;
DELIMITER //
CREATE PROCEDURE IF NOT EXISTS INSERT_product_sizes(
IN productID int,
IN sizeIDs varchar(100)
)
BEGIN
DECLARE delimiterCount int;
DECLARE sizeID int;
DECLARE loopCount int;
/* Remove spaces, if any, from input string */
SET sizeIDs = REPLACE(sizeIDs, ' ', '');
/* Determine how many commas are in input string */
SET delimiterCount = LENGTH(sizeIDs) - LENGTH(REPLACE(sizeIDs, ',', ''));
SET loopCount = 1;
/* For each id in input string */
WHILE loopCount <= delimiterCount + 1 DO
SET sizeID = SUBSTRING_INDEX(sizeIDs, ',', 1);
INSERT INTO
product_size
(product_id, size_id)
VALUES
(productID, sizeID);
/* Remove last used id from input string */
SET sizeIDs = REPLACE(sizeIDs, CONCAT(sizeID, ','), '');
SET loopCount = loopCount + 1;
END WHILE;
END //
DELIMITER ;
Если вы хотите, чтобы все размеры были прикреплены к продукту на вставке, тогда простое
insert into product_size(product_id,size_id)
select inprodid,name
from size
;
Сделаю. Но если вам нужны только некоторые размеры, вы можете передать размеры в виде строки с разделителями, разделив их в процедуре в цикле, которая будет содержать инструкцию insert. Вы найдете примеры того, как разделить строки, если вы используете mysql split string.