#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. Настройте типы данных локальных переменных в соответствии с вашей фактической структурой таблицы.