Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: BULK INSERT при двух связанных таблицах ?

Есть 2 таблицы и интерфейс их наполнения:

Код

CREATE TABLE `serial` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `serial` varchar(255) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `serial` (`serial`),
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

CREATE TABLE `player` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `mac` varchar(255) NOT NULL,
  `serial_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `mac` (`mac`),
  UNIQUE KEY `serial_id` (`serial_id`),
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;


Проблема в том, что эти две таблицы связаны между собой (serial_id один к одному) и я не могу использовать BULK INSERT (т.к. необходимо сначала вставить запись в одну таблицу, узнав ее PRIMARY KEY, затем вставить запись в другую связанную таблицу используя полученный PRIMARY ID ). 

То есть я делаю парсинг примерно такого файла:

00:16:fb:86:d0:d7 | BW678DS78
00:16:fb:86:d0:c5 | JFH76GJH
00:16:fb:87:af:2e | JKKJHD767
00:16:fb:87:af:36 | STF67JG67

где соответственно надо добавить серийник (BW678DS78) в таблицу serial, мак (00:16:fb:86:d0:d7) в таблицу player и связать их друг с другом. Строк в таких файлах может насчитывать несколько тысяч.

А это получается цикл из нескольких тысячей INSERT друг за другом. 

Как можно оптимизировать этот процесс? 



Это сообщение отредактировал(а) martin88 - 3.8.2015, 17:58
Ответ:
Есть 2 таблицы и интерфейс их наполнения:

Код

CREATE TABLE `serial` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `serial` varchar(255) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `serial` (`serial`),
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

CREATE TABLE `player` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `mac` varchar(255) NOT NULL,
  `serial_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `mac` (`mac`),
  UNIQUE KEY `serial_id` (`serial_id`),
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;


Проблема в том, что эти две таблицы связаны между собой (serial_id один к одному) и я не могу использовать BULK INSERT (т.к. необходимо сначала вставить запись в одну таблицу, узнав ее PRIMARY KEY, затем вставить запись в другую связанную таблицу используя полученный PRIMARY ID ). 

То есть я делаю парсинг примерно такого файла:

00:16:fb:86:d0:d7 | BW678DS78
00:16:fb:86:d0:c5 | JFH76GJH
00:16:fb:87:af:2e | JKKJHD767
00:16:fb:87:af:36 | STF67JG67

где соответственно надо добавить серийник (BW678DS78) в таблицу serial, мак (00:16:fb:86:d0:d7) в таблицу player и связать их друг с другом. Строк в таких файлах может насчитывать несколько тысяч.

А это получается цикл из нескольких тысячей INSERT друг за другом. 

Как можно оптимизировать этот процесс? 



Это сообщение отредактировал(а) martin88 - 3.8.2015, 17:58
Вопрос: BULK INSERT при двух связанных таблицах ?

Есть интерфейс добавления большого объема данных в 2 таблицы MySQL.

Проблема в том, что эти две таблицы связаны между собой по FK (один к одному) и я не могу использовать BULK INSERT (т.к. необходимо сначала вставить запись в одну таблицу, узнав ее PRIMARY KEY, затем вставить запись в другую связанную таблицу используя полученный PRIMARY ID ).

А это получается цикл из нескольких тысячей INSERT друг за другом.

Как можно оптимизировать этот процесс?

Есть одна особенность - первая таблица имеет уникальных индекс помимо PRIMERY KEY (заведомо известный при вставке данных), будет ли хорошей идеей использовать его вместо PRIMERY KEY (это уникальная строка) и тогда проблема пакетной вставке будет решена?
Ответ:
alex564657498765453
ЗЫЗЫ имеено для случая такого майкрософт настоятельно рекомендует уже лет 10 использовать гиуд вкачестве первичного ключа.
когда лет через 50 начнутся глобальные коллизии гуидов... а впрочем, эмир к тому времени уже скорее всего помрёт :)
Вопрос: Как в rules для view двух связанных таблиц добавить id внешнего ключа?

Здравствуйте, уважаемые проектировщики! Только начинаю работать с PostrgeSQL и не могу разобраться, как грамотно создавать представления и правила _insert для связанных таблиц, а именно, как правильно добавлять внешний ключ записям дочерней таблицы. Вот пример:
Есть две таблцы:
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
desc TEXT NOT NULL
);
CREATE TABLE customers(
id SERIAL PRIMARY KEY,
order_id INT NOT NULL REFERENCES orders(id),
fname TEXT NOT NULL,
lname TEXT NOT NULL
);

Работать с ними можно только через вьюху. Создаю нечто, вроде:

CREATE OR REPLACE VIEW vw_orders_customers AS
SELECT orders.id as orders_id, orders.desc as desc,
customers.id as customer_id, customers.fname as fname, customers.lname as lname, customers.order_id as order_id
FROM orders, customers
WHERE orders.id = customers.order_id;

Задача добавления следующая: добавляется один заказ и к нему сразу добавляются один (или несколько) клиентов.

Пробую создать правило на insert:
CREATE OR REPLACE RULE _insert AS ON INSERT TO vw_orders_customers DO INSTEAD (
INSERT INTO orders (desc)
VALUES (NEW.desc);
INSERT INTO customers (fname, lname, order_id)
VALUES (new.fname, new.lname, SELECT currval('orders_id_seq'))
RETURNING
SELECT currval('orders_id_seq'), (SELECT desc FROM orders WHERE id = SELECT currval('orders_id_seq')),
customers.id, customers.fname, customers.lname, customers.order_id)
);

Но я явно что-то делаю не так... Сейчас проблема с обращением к последовательностям по currval(). До этого пробовал что-то вроде: select MAX(id) from orders =) Удивительно, но так insert работал, правда в order_id добавлял всегда id первой строки таблицы (в хронологическом порядке, независимо от сортировки по ORDER).
Подскажите, пожалуйста, как правильно создавать вьюхи и правила на insert для связанных таблиц или где хотя-бы про это почитать? Как действовать в этом конкретном случае?
Ответ:
qwwq
не взлетело.


краткая суть топика
Вопрос: Сделать умную выборку из двух связанных таблиц

Есть 2 связанные таблицы: банкоматы и контракты. Связаны по полю серийный_номер банкомата.
Когда банкомат перевозится со старого места установки на новое, старый контракт закрывается, а новый открывается.
У банкомата в таблице банкоматы может быть флаг что банкомат находится на гарантии.

Нужно отобразить все банкоматы на гарантии и отобразить их последнее место установки с адресом

Вот пример:

таблица1 Банкоматы:
серийный номер - текстовый уникальный индекс
на_гарантии - логическое значение

таблица2 Контракты:
системный_номер - индекс, уникальное увеличивающееся число
адрес_установки - текстовый
банкомат_демонтирован - логическое значение
серийный номер - связь с таблицей1

Например я делаю запрос чтобы поле на_гарантии было ИСТИНА, но в результат попадают все места установки из таблицы контракты
Ответ: Да, кавычки это беда...
Вопрос: Добавление в таблицу подстановки из двух связанных таблиц

Ms.Access 2013. Только осваиваю.

Есть таблицы

- Страны (id(int,AI);Name(str)) - просто названия стран

заполнена как
1;Россия
2;США

- Деньги (id(int,AI);Страны->id(связь,Int),Name(str)) - название денег в странах

заполнена как
1;1;Рубль
2;1;Копейка
3;2;Доллар
4;2;Цент

- Основная: Монеты (id(int,AI);Name(str);Страны->id(связь,Int)) - названия монет и страны

заполнена как (пишу id, не отображения)
1;Монета1;1
2;Монета2;2
3;Монета3;1
4;Монета4;2

Вопрос: Как в т.Монеты добавить поле "Название денег->Name", опираясь на id Страны из этой таблицы?

Подробнее.

Вот есть 3 таблицы, заполнил первые 2, создал 3, связал поля с первыми двумя, все работает. Теперь нужно, чтобы в т.Монеты появилось 4е поле, которое предоставляло выбор в зависимости от того, что выбрали в поле 3. Т.е. выбираем Россия получаем выбор из рублей и копеек, выбрали США, выбираем между доллар и цент. Никак не получается сделать связями. Можно последовательность действий описать или скрин как сделать или где почитать? И возможно ли это вообще?

Спасибо.
Ответ: На уровне таблицы эту задачу не решить. Да и не нужно.
Ввод данных нужно выполнять через форму.
Читайте ФАК про связанные списки.
Вопрос: Нормализация БД, две связанные таблицы. А что дальше?

Здравствуйте.
Помогите разобраться с задачкой

Есть две таблицы РАБОТНИКИ и КОМПАНИИ (названия изменены)

РАБОТНИКИ
id_работника
имя_работника
id_компании (в которой он работает)

КОМПАНИИ
id_компании
название_компании
id_работника (который в ней работает)

с помощью SQL запросов создал две таблицы, настроил FOREIGN KEY для каждой:
в РАБОТНИКАХ:
Код SQL
1
CONSTRAINT one FOREIGN KEY (id_компании) REFERENCES КОМПАНИИ(id_компании)
в КОМПАНИЯХ:
Код SQL
1
CONSTRAINT two FOREIGN KEY (id_работника) REFERENCES РАБОТНИКИ(id_работника)
Но как добавлять запросы в этом случае? Не могу добавить работника, так как нет записей id_компании для него, не могу добавить компанию, так как нет id_работника для неё

NULL - не работает, пишу

Код SQL
1
2
INSERT INTO hr.companies  
VALUES (6, 'microsoft', NULL); 
потом
Код SQL
1
SELECT * FROM hr.companies
и пусто
Название: 635617200021561093.png
Просмотров: 29

Размер: 3.7 Кб

Что делать? Как быть?) Может создать доп таблицу и связывать в ней?
Ответ:
Цитата Сообщение от sw_dr Посмотреть сообщение
по какому принципу
1. из компаний выкинуть ссылку на работника (это вообще неизвестно что означает).
2. из работников выкинуть ссылку на компанию (если работник может работать в нескольких. Если только в одной, то ссылку можно оставить и обойтись без третьей таблицы).
3. если нужна третья таблица (см. п 2), то она будет состоять из 2 полей: id компании и id работника
Вопрос: Создание связанных таблиц на вкладке формы

Access 2007. На форме сделаны 2 вкладки. На одной из них хотелось бы разместить две связанные таблицы. При этом хотелось бы подчиненную таблицу редактировать не с помощью плюсика на основной таблице, а путем редактирования подчиненной таблицы. Проект прикрепил.
Ответ: На кнопку нажал.
Вопрос: Вывести данные из двух связанных таблиц

Добрый день,пожалуйста, помогите мне у меня 2 таблицы с товарами магазина,первая таблица это полученные продукты, и вторую таблицу расход. как сделать запрос чтобы показать мои продукты, дата, цена в одной таблице
здесь файл
Ответ: У каждого товара должен быть свой, уникальный код. Товар может присутствовать в обоих таблицах, но код у товара един и там и там. Как присвоить код товару Вам решать (ручками/программно). Цепляясь за этот код можно увидеть общую картину из двух таблиц.
Вопрос: Связанные таблицы

Мне приходят несколько файлов csv/ xlsx. Каждый файл - будущая таблица в бд.
В файлах нет первичных ключей.
Создаю в access связанные таблицы. Они получаются без первичных ключей.
У всех таблиц(файлов) есть общее поле(текстовое).
По этому полю можно связать таблицы.
Как это сделать?
Ответ:
Сообщение от saikle
Создаю в access связанные таблицы.
Присоединенные таблицы можно связать в схеме данных, без обеспечения целостности, естественно, в запросах. Но обычно такие присоединенные таблицы используются для добавления новых данных в таблицы Аксесса, в которых уже есть ключи. И основная работа уже с этими таблицами.
Вопрос: Связанные таблицы и БД с паролем

Добрый день.
Попробовал воспользоваться поиском - но к сожалению, ничего подходящего не нашел.
Подскажите, пожалуйста, можно ли решить следующую проблему:
Есть 2 базы Access 2000, одна с данными, другая - с формами, отчетами и связанными таблицами из первой БД.
При открытии второй БД программно удаляются все связанные таблицы и связываются заново с помощью TransferDatabase. Все работает.
Ситуация изменилась и на первую БД поставлен пароль БД. Естественно, что при автоматическом линковании таблиц теперь запрашивается пароль - что не очень хорошо.
Обойти запрос пароля удалось с помощью следующего кода:
Dim db As DAO.Database, tdf As TableDef
Set db = CurrentDb
Set tdf = db.CreateTableDef("Table1")
tdf.Connect = "MS Access;PWD=123;DATABASE=C:\base.mdb"
tdf.SourceTableName = "Table1"
db.TableDefs.Append tdf
но данный вариант работает существенно дольше исходного - когда не было пароля и связь делалась через TransferDatabase.
Вопросы:
Почему вариант связывания через TableDef намного меделеннее и можно ли ускорить?
Можно ли используя TransferDatabase указать пароль подключения к БД?
Ответ:
0246
K-Nick,

А если, всё-таки, сделать именно так, как в предложенном решении? 1369522
'1) открываете явно необходимую базу в текущем "рабочем пространстве"
Set dB = Workspaces(0).OpenDatabase("C:\base.mdb", False, False, "MS Access;PWD=123")

'2) линкуетесь - здесь пароль не будет спрошен.
DoCmd.TransferDatabase acLink, "Microsoft Access", "C:\base.mdb", acTable, _
"Table1", "Table1"

'3) закрываете запароленную базу, если надо
dB.Close


Большое спасибо.
Правда, Workspaces(0) не помогло, но по Вашей подсказке я обратил внимание, что там стоит два False, т.е. нужно указывать
Set db = OpenDatabase(DatabaseName, False, False, "MS Access;PWD=" & DBPSW)
а не
Set db = OpenDatabase(DatabaseName, False, True, "MS Access;PWD=" & DBPSW)
как было сделано у меня.