如何在 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
我目前正在制作一个数据库 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