Как использовать данные столбца из таблицы в процедуре mysql? - PullRequest
0 голосов
/ 20 марта 2020

В настоящее время я создаю таблицу базы данных, которая разделяет разделенный запятыми список тегов от одной таблицы до таблицы, содержащей каждый уникальный тег в первой таблице. В конечном счете, это будет использоваться для создания таблицы, в которой каждый тег соединяется с каждым идентификатором, который имеет его. Я создал процедуру, которая разделяет список значений на основе запятых и вставляет каждое значение в таблицу:

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 ;

Но я не знаю, как вызвать процедуру для каждой строки первой таблицы.

В случае необходимости, вот информация для моих таблиц:

RawRecipes: rid INT (первичный ключ) ... теги VARCHAR (1000)

Теги: tid INT (первичный ключ), тег VARCHAR (уникальный)

Примерный список тегов выглядит следующим образом:

['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 В каждой строке есть что-то похожее на это и я хотел бы запустить процедуру для каждого из них, чтобы разделить каждое значение в его собственную строку

1 Ответ

0 голосов
/ 20 марта 2020

Мне пришлось переписать вашу попытку. Ваша итерация 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...