Попытка Запустить хранимую процедуру в MySQL, и она завершается неудачно из-за ограничения внешнего ключа.
Я написал простую хранимую процедуру с циклом while, который не работает. Вот некоторые данные для вас: родительская таблица - data_client_id. Все таблицы innoDB. Первичный ключ - это ID. Все остальные таблицы в схеме с префиксом data_ имеют этот столбец (data_client_id.id) в качестве внешнего ключа. Я сгенерировал некоторые фиктивные данные и вставил их в таблицу data_client_id, которая автоматически увеличивает первичный ключ. Сгенерированные строки были с 33 по 132. Я намеревался написать одну хранимую процедуру, которая создала бы строки с совпадающими значениями в столбце id для всех других таблиц data_.
Вот мой код:
mysql> DELIMITER //
mysql> CREATE PROCEDURE this()
-> BEGIN
-> DECLARE v1 INT;
-> SET v1 = 33;
-> WHILE v1 < 132 DO
-> INSERT INTO data_banking (id) VALUES(v1);
-> SET v1 = v1+1;
-> END WHILE;
-> END//
Query OK, 0 rows affected (0.00 sec)
Затем, когда я называю это (); Процедура я получаю следующую ошибку:
mysql> call this();
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`oms_clients`.`data_banking`, CONSTRAINT `data_banking_FK` FOREIGN KEY (`id`) REFERENCES `data_client_id` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION)
Я попытался просто запустить отдельные INSERT в таблицах data_ следующим образом: INSERT into data_banking (id) VALUES (34);
и это работало, устанавливая все столбцы со значениями по умолчанию NULL или их соответствующими значениями по умолчанию SET...
1 ответ
Нет ничего плохого в вашей хранимой процедуре.
Проблема в том, что вы не можете вставить прогон в data_banking, если только SAME id не существует в data_client_id. Каждый идентификатор с 33 по 132.
Чтобы устранить проблему, удалите ограничение или убедитесь, что зависимость от внешнего ключа разрешена.
Вот хорошая ссылка с некоторыми полезными советами: