Мне пришлось переписать вашу попытку. Ваша итерация l oop выдавала ошибки, поэтому я изменил код, чтобы удалить первое добавленное значение
Далее я добавил курсор для RawRecipes, потому что я считаю, что вы хотите добавить все теги из каждой строки.
вам следует подумать о сокращении процедуры до параметра Input, который разделит теги, и вызвать его в AFTER INSERT TRIGGER, чтобы при вставке строки в RawRecipes теги автоматически добавлялись
Тогда, конечно, вы также должны проверить в триггере AFTER UPDATE, изменился ли тег в RawRecipes, и затем вызвать процедуру, которая разделяет слова
DELIMITER $$
DROP PROCEDURE IF EXISTS InsertTags;
CREATE DEFINER=`root`@`localhost` PROCEDURE `InsertTags`()
BEGIN
DECLARE token TEXT DEFAULT NULL;
DECLARE toklength INT DEFAULT NULL;
DECLARE TempValue TEXT DEFAULT NULL;
DECLARE Value VARCHAR(1000);
DECLARE finished INTEGER DEFAULT 0;
DEClARE curtags
CURSOR FOR
SELECT tags from RawRecipes;
DECLARE CONTINUE HANDLER
FOR NOT FOUND SET finished = 1;
OPEN curtags;
gettags: LOOP
FETCH curtags INTO Value;
IF finished = 1 THEN
LEAVE gettags;
END IF;
iterator:
LOOP
IF LENGTH(TRIM(Value)) = 0 OR Value IS NULL THEN
LEAVE iterator;
END IF;
SET token = SUBSTRING_INDEX(Value,',',1);
SET TempValue = TRIM(token);
INSERT IGNORE INTO tags (tag) VALUES (TempValue);
SET Value = SUBSTRING_INDEX(Value,',',-(LENGTH(Value) - LENGTH(REPLACE(Value, ',', '')) ));
END LOOP iterator;
END LOOP gettags;
CLOSE curtags;
END$$
DELIMITER ;
UPDATE
MYsql игнорирует INSERT IGNORE INTO, а также REPLACE и снова добавляет все теги
Так что теги также должны быть уникальными, чтобы не было двойных записей
Like
CREATE TABLE `tags` (
`tid` int NOT NULL AUTO_INCREMENT,
`tag` varchar(100) DEFAULT NULL,
PRIMARY KEY (`tid`),
UNIQUE KEY `tid_unique` (`tid`)
,
UNIQUE KEY `tag_unique` (`tag`)
) ENGINE=InnoDB AUTO_INCREMENT=14337 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
ALTER TABLE tags AUTO_INCREMENT = 1;
CREATE TABLE `rawrecipes` (
`rid` int NOT NULL,
`tags` varchar(1000) DEFAULT NULL,
PRIMARY KEY (`rid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
# tags
weeknight, time-to-make, course, preparation, occasion, low-protein, healthy, 5-ingredients-or-less, desserts, 1-day-or-more, easy, low-fat, summer, frozen-desserts, freezer,
dietary, low-sodium, gluten-free, low-cholesterol, seasonal, low-saturated-fat, low-calorie, healthy-2, free-of-something, low-in-something, equipment
aaa,bbb,ccc,ddd,eee,ddd,fff