|
LOAD DATA INFILE в две таблицы сразу
|
|||
---|---|---|---|
#18+
Задача навеяна одной из тем на другом форуме. Показалась интересной. Решена. Постановка задачи. Имеется текстовый файл формата JSONL, содержащий набор объектов в формате JSON. Каждая строка представляет из себя один валидный JSON, причём в нём присутствуют вложенные объекты. Весь файл, само собой, валидным JSON не является. Необходимо выполнить импорт данных в две таблицы с парсингом и с сохранением ссылочной целостности. Использованный подход можно понять на примере следующей модели. Структура таблиц: Код: sql 1. 2. 3. 4. 5. 6.
Пример текстового файла: {"master_value":"master value 1", "slave_value":["slave value 1", "slave value 2", "slave value 3"]} {"master_value":"master value 2", "slave_value":["slave value 4", "slave value 5"]} Суть решения. Импорт выполняется запросом LOAD DATA INFILE. В процессе импорта используется препроцессинг, прочитанная строка JSON-объекта сохраняется в определённой пользователем переменной (@variable), которая определена для соединения и видна в нём, в том числе и в вызываемых объектах (функции, процедуры, триггеры). Парсинг в основную таблицу выполняется обычным образом. Парсинг в зависимую таблицу выполняется в триггере по событию вставки в основную таблицу. Код триггера: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9.
Запрос на импорт данных: Код: sql 1. 2. 3.
В результате данные помещены в обе таблицы с сохранением ссылочной целостности. лог консоли Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49.
Понятно, что JSON - это не обязательное условие. Таким же образом может быть выполнен импорт данных в любом формате - и в обычном CSV, и в сериализованном средствами PHP, и, в общем, каком угодно. Ну и само собой надо не забыть немедленно по завершении импорта удалить триггер. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2021, 15:49 |
|
|
start [/forum/topic.php?fid=47&fpage=9&tid=1828074]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
68ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
29ms |
get tp. blocked users: |
2ms |
others: | 16ms |
total: | 160ms |
0 / 0 |