如何在 mysql 过程中使用来自 table 的列数据?

How to use column data from a table in a mysql procedure?

我目前正在制作一个数据库 table,它将逗号分隔的标签列表从一个 table 分隔为一个 table,其中包含第一个 [=25= 中的每个唯一标签].最终,这将用于创建一个 table ,其中每个标签都与拥有它的每个 id 连接在一起。我创建了一个过程,该过程根据逗号分隔值列表并将每个值插入 table:

DELIMITER //
DROP PROCEDURE IF EXISTS InsertTags;
CREATE PROCEDURE InsertTags
SELECT (Tags) from RawRecipes;
    BEGIN
    DECLARE token TEXT DEFAULT NULL;
    DECLARE toklength INT DEFAULT NULL;
    DECLARE TempValue TEXT DEFAULT NULL;
    iterator:
    LOOP
        IF LENGTH(TRIM(Value)) = 0 OR Value IS NULL THEN
            LEAVE iterator;
        END IF;
        SET token = SUBSTRING_INDEX(Value,',',1);
        SET toklength = LENGTH(token);
        SET TempValue = TRIM(front);
        INSERT IGNORE INTO Tags (tag) VALUES (TempValue);
        SET Value = INSERT(Value,1,frontlen + 1,'');
    END LOOP;
    END //
DELIMITER ;

但我不知道如何为第一行的每一行调用程序table。

如果需要,这里是我的 table 的信息:

RawRecipes: rid INT (Primary Key)...tags VARCHAR(1000)

Tags: tid INT (Primary Key), tag VARCHAR (Unique)

标签示例列表如下所示:

['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']

tl:dr 每一行都有与此类似的内容,我想 运行 每一行的过程将每个值分隔到它自己的行中

我不得不重写你的尝试。 您的迭代循环出错,所以我更改了代码以删除第一个附加值

此外,我为 RawRecipes 添加了一个游标,因为我相信您想添加每一行的所有标签。

你应该考虑将程序减少到一个将拆分标签的输入参数,并在 AFTER INSERT TRIGGER 中调用它,这样当你将一行插入 RawRecipes 时,标签会自动添加

当然,如果 RawRecipes 中的标签已更改,您当然还应该检查 AFTER UPDATE 触发器,然后调用分隔单词的过程

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 ;

更新

MYsql 忽略 INSERT IGNORE INTO AND also REPLACE 并再次添加所有标签

所以标签也必须是唯一的,没有重复条目

喜欢

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