powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Запись в БД (MySQL5.5+) с выбором Insert или Update и выборкой кодов с таблиц-справочников
6 сообщений из 6, страница 1 из 1
Запись в БД (MySQL5.5+) с выбором Insert или Update и выборкой кодов с таблиц-справочников
    #39380619
Death_R
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.

Приходит прайс в XML (точнее куча файлов по 100 записей (пока что, но будет где-то по 1000). Имеем такие данные: ИД (он же штрихкод), ИД категории товара (конфеты, фрукты, ...), Наименование, Количество, ИД единицы измерения (шт., гр., кг., ...), Цена, другая информация (много полей, в т.ч. с значениями со справочников). Категории товара и Единицы измерения приходят отдельным файлом. Это все "добро" нужно раскинуть в три таблицы (товары(catalog), Категории товаров(kategor) и Единицы измерения(ediz), по такому критерию - если такого товара еще нету в базе, то его нужно добавить, а если есть - обновить цену; то же самое с категориями и единицами измерения, но только нужно еще получить их ИД для подстановки при вставке записи о товаре.
Самый простой вариант реализации (по записям):
1. Запрос на получение ИД категории товара.
2. Если пустой, тогда запрос на добавление категории + Получение ИД.
3. Получение ИД единицы измерения,
4. Если пустой - вставка + Получение ИД.
...
n. Запрос на получение ИД товара
n+1. Если пустой, то вставка, если не пустой - обновление.
Можно еще сначала обновить все справочники, а потом пускать использовать подзапросы при вставке товаров. Но все это как-то громоздко и кажется мне не по феншую (к примеру применение ON DUPLICATE KEY UPDATE влечет за собой увеличение счетчика автоинкремента даже при обновлении записи).
Собственно интересует механизм уменьшения запросов к БД без увеличения нагрузки. Примеры приветствуются
...
Рейтинг: 0 / 0
Запись в БД (MySQL5.5+) с выбором Insert или Update и выборкой кодов с таблиц-справочников
    #39380643
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Death_RЕсли пустой, тогда запрос на добавление ... + получение ИД.
INSERT ... ON DUPLICATE KEY UPDATE ...
и затем
SELECT ...

Death_Rприменение ON DUPLICATE KEY UPDATE влечет за собой увеличение счетчика автоинкремента даже при обновлении записи
И что?

Death_RСамый простой вариант реализации (по записям)
Но не самый правильный. Правильнее - всё грузишь во временную таблицу, а потом раскидываешь - одним запросом всё в одну таблицу, потом всё в другую и всё в третью. Суммарно получится 4 запроса, и неважно, сколько записей.

Death_RПримеры приветствуются
Тест-набор в студию.
...
Рейтинг: 0 / 0
Запись в БД (MySQL5.5+) с выбором Insert или Update и выборкой кодов с таблиц-справочников
    #39380983
Death_R
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AkinaПравильнее - всё грузишь во временную таблицу, а потом раскидываешь - одним запросом всё в одну таблицу, потом всё в другую и всё в третью. Суммарно получится 4 запроса, и неважно, сколько записей.Не совсем понял о "все в одну временную таблицу" (Таблица kategor: ID (autoincrement), kname, describe, ID_kimport; Таблица ediz: ID(autoincrement), iname, ID_iimport; Таблица catalog: ID(autoincrement), ID_sk(штрихкод), ID_kategor, cname, kol, ID_ediz, price)?? И как потом раскинуть это все одним запросом в одну таблицу, ... ?
AkinaТест-набор в студию.пока идет проектирование, поэтому тестовых данных нету.
...
Рейтинг: 0 / 0
Запись в БД (MySQL5.5+) с выбором Insert или Update и выборкой кодов с таблиц-справочников
    #39381077
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да минимальную модель собери - DDL трёх таблиц, CSV на десяток записей и желаемый итог раскладки его по таблицам с пояснениями, почему так. На 10 минут делов-то, включая перекур... тебе же принцип нужен, а не отлизанный код?
...
Рейтинг: 0 / 0
Запись в БД (MySQL5.5+) с выбором Insert или Update и выборкой кодов с таблиц-справочников
    #39381078
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пардон, XML на десяток записей.
...
Рейтинг: 0 / 0
Запись в БД (MySQL5.5+) с выбором Insert или Update и выборкой кодов с таблиц-справочников
    #39381149
Death_R
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: xml
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.
<?xml version="1.0" encoding="UTF-8"?>
<prices>
	<tovar idimp="15e9b8c48d">
		<name>Пиво Жигулевское</name>
		<kategor idimp="bgr07ed95">Алкогольные напитки</kategor>
		<edizm idimp="f93e1128c83a">Ящик</edizm>
		<col>5</col>
		<price>240.5</price>
	</tovar>
	<tovar idimp="65lc8we24s">
		<name>Груши</name>
		<kategor idimp="fd512dfser3">Фрукты</kategor>
		<edizm idimp="f93e1128c83a">ящик</edizm>
		<col>3</col>
		<price>1055.47</price>
	</tovar>
	<tovar idimp="dys51te3z89v">
		<name>Ананас</name>
		<kategor idimp="fd512dfser3">Фрукты</kategor>
		<edizm idimp="dskut7fd2d">шт.</edizm>
		<col>5</col>
		<price>195.7</price>
	</tovar>
	<tovar idimp="k8eg5r6t5">
		<name>Топор</name>
		<kategor>Инструменты</kategor>
		<edizm idimp="dskut7fd2d">шт.</edizm>
		<col>10</col>
		<price>159.99</price>
	</tovar>
	<tovar idimp="lekrw6kdr">
		<name>Яблоки красные</name>
		<kategor idimp="fd512dfser3">Фрукты</kategor>
		<edizm idimp="zve5sr0ht6">кг</edizm>
		<col>50</col>
		<price>55.2</price>
	</tovar>
</prices>



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
CREATE DATABASE `test`;

USE `test`;

CREATE TABLE `kategor` ( `id` INT NOT NULL AUTO_INCREMENT , `kname` VARCHAR(70) NOT NULL , `descr` VARCHAR(155) NULL , `id_kimport` VARCHAR(15) NULL , PRIMARY KEY (`id`), INDEX `kname` (`kname`)) ENGINE = InnoDB;

CREATE TABLE `ediz` ( `id` INT NOT NULL AUTO_INCREMENT , `iname` VARCHAR(10) NOT NULL , `id_iimport` VARCHAR(15) NULL , PRIMARY KEY (`id`), INDEX `iname` (`iname`)) ENGINE = InnoDB;

CREATE TABLE `catalog` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT , `id_kategor` INT NOT NULL , `cname` VARCHAR(150) NOT NULL , `kol` INT NOT NULL DEFAULT '0' , `id_ediz` INT NOT NULL , `price` DECIMAL(15.2) NOT NULL,
`id_cimport` VARCHAR(15) NULL, DEFAULT '0' , PRIMARY KEY (`id`), INDEX `indName` (`cname`)) ENGINE = InnoDB;

INSERT INTO `test`.`ediz` (`id`, `iname`, `id_iimport`) VALUES (NULL, 'шт.', 'dskut7fd2d');
INSERT INTO `kategor` (`id`, `kname`, `descr`, `id_kimport`) VALUES (NULL, 'Фрукты', NULL, 'fd512dfser3');
INSERT INTO `test`.`catalog` (`id`, `id_kategor`, `cname`, `kol`, `id_ediz`, `price`, `id_cimport`) VALUES (NULL, '1', 'Ананас', '10', '1', '180', 'dys51te3z89v');



На выходе должны получить такое:
Таблица единиц измерения
id iname id_iimpor 1шт. dskut7fd2d 2ящикf93e1128c83a3кгzve5sr0ht6
синим выделен ИД-импорта, которого нету при добавлении "Топор", но в таблице он должен остаться

Таблица категорий
id kname descr id_kimport 1Фруктыfd512dfser32Алкогольные напиткиbgr07ed953Инструментыjdhr69etr3

Таблица товаров
id id_kategor cname kol id_ediz price id_cimport 11Ананас10 5 195.7 dys51te3z89v22Пиво Жигулевское52240.515e9b8c48d31Груши321055.4765lc8we24s43Топор101159.99k8eg5r6t551Яблоки красные50355.2lekrw6kdr
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Запись в БД (MySQL5.5+) с выбором Insert или Update и выборкой кодов с таблиц-справочников
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]