MySQL заполняет другую таблицу с помощью процедуры или другим способом

#php #mysql #stored-procedures #sql-insert

#php #mysql #хранимые процедуры #sql-вставка

Вопрос:

в моей базе данных есть две таблицы.

таблица с именем «a», которая имеет такую структуру :

 ID  COD     F   L   Q S
1   MI001   1   1   1 E
2   MI002   1   1   1 E
3   MI003   2   2   2 E
4   MI004   1   2   3 E
5   MI005   1   1   1 E
  

таблица с именем ‘b’, в которой у меня есть такая структура

 ID | A_ID | A_ID_NEW
  

я хочу, представьте, что у меня есть кнопка или функция в моем приложении, которую я получаю из таблицы ‘a’, например, я получаю идентификаторы ‘1’ и ‘2’ .

итак, я вставлю в таблицу a новый регистр, получающий данные из вашего идентификатора, поэтому таблица «a» должна быть такой, как показано ниже :

 
ID  COD     F   L   Q S
1   MI001   1   1   1 E
2   MI002   1   2   1 E
3   MI003   2   2   2 E
4   MI004   1   2   3 E
5   MI005   1   1   1 E
6   MI001   1   1   1 T
7   MI002   1   2   1 T
  

и вставить в таблицу с именем ‘b’, как показано ниже :

 ID | A_ID | A_ID_NEW
1  | 1    | 6
2  | 2    | 7
  

это возможно?

Комментарии:

1. Почему новые идентификаторы в таблице b равны 4 и 5, тогда как в таблице a они равны 6 и 7? Должен ли столбец S строго 'E' и в строке копировать, на которое он должен быть установлен строго 'T' ? это возможно? Конечно. Один запрос один триггер. Или 2 запроса в транзакции.

2. извините, у меня есть редактирование. столбец S может иметь другой статус, но когда пользователь нажимает на transfer (мое серверное приложение), он должен быть «T».

Ответ №1:

 CREATE PROCEDURE populate_rows (ids TEXT)
BEGIN
DECLARE id INT;
DECLARE cod CHAR(5);
DECLARE f TINYINT;
DECLARE l TINYINT;
DECLARE q TINYINT;
DECLARE s CHAR(1);
DECLARE done INT DEFAULT FALSE;
DECLARE cur CURSOR FOR SELECT * FROM a WHERE FIND_IN_SET(a.id, ids);
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cur;
cycle: REPEAT
    FETCH cur INTO id, cod, f, l, q, s;
    IF done THEN
        LEAVE cycle;
    END IF;
    INSERT INTO a VALUES (NULL, cod, f, l, q, 'T');
    INSERT INTO b SELECT NULL, id, MAX(a.id) FROM a;
UNTIL done END REPEAT cycle;
END
  

скрипка

PS. Процедура не учитывает никаких помех от параллельных процессов или любых других проблем, которые могут возникнуть во время процесса.

PPS. Настройте типы данных локальных переменных в соответствии с вашей фактической структурой таблицы.