множественный insert

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
BION
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 259
Зарегистрирован: 24.01.2005 (Пн) 21:05

множественный insert

Сообщение BION » 11.01.2008 (Пт) 0:18

Друзья, у меня вот такой трабл...
Есть некий источник данных, допустим массив, в нем множество номеров телефонов с коментами(около 1000), так вот, мне необходимо сформировать один единственный запрос insert на внесение всех этого справочника.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 11.01.2008 (Пт) 10:02

База какая?
Lasciate ogni speranza, voi ch'entrate.

Ramzes
Скромный человек
Скромный человек
Аватара пользователя
 
Сообщения: 5004
Зарегистрирован: 12.04.2003 (Сб) 11:59
Откуда: Из гробницы :)

Сообщение Ramzes » 11.01.2008 (Пт) 11:01

так попробуй

insert into tbl (col)
select 'a'
union
select 'b'
union
select 'c'

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 11.01.2008 (Пт) 11:52

Это плохой совет.
Лучше всего несколько insert-ов, по каждому на запись. Не очень быстро, зато универсально.
Некоторые СУБД понимают, когда в одном insert указываются значения для нескольких строк (типа insert into table1 (field1) values (1,2,3,4,5)).
Некоторые СУБД поддерживают режим bulk insert, это было бы оптимальным.
Lasciate ogni speranza, voi ch'entrate.

Ramzes
Скромный человек
Скромный человек
Аватара пользователя
 
Сообщения: 5004
Зарегистрирован: 12.04.2003 (Сб) 11:59
Откуда: Из гробницы :)

Сообщение Ramzes » 11.01.2008 (Пт) 12:27

alibek
а чем конкретно он плохой?

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 11.01.2008 (Пт) 14:55

Не совсем понятно что надо...

Потому непонятно и чем не устраивает:

Код: Выделить всё
INSERT INTO MyNewTable FROM SELECT * FROM MyOldTable
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

BION
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 259
Зарегистрирован: 24.01.2005 (Пн) 21:05

Сообщение BION » 12.01.2008 (Сб) 10:15

alibek
База - Access

Andrey Fedorov писал(а):Не совсем понятно что надо...

Допустим есть массив, в нем много много стрингов(не путать с ниж. бельем:)) дорустим где-то около 50000, а вообще в дальнейшем будет коллекция объектов содержащих инфу об абонентах.
Данные выдираются не из базы, а из скажем так, хреновой структуры данных, поэтому без массивов и коллекций не обойтись. И INSERT INTO MyNewTable FROM SELECT * FROM MyOldTable тоже не получится.
Так вот, мне что-то не кошерно делать 50000 запросов insert (хотя хз, можт и ничего страшного и база выдеожит такую DDoS атаку:)) => интересует, как сделать нечто:
Код: Выделить всё
INSERT INTO Abonentos(abon_name, phone_num) VALUES('вася', '1234', 'Валодька Путин', '777', ......... и т.д.)

Summer.05
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 28.12.2005 (Ср) 20:19
Откуда: Москва

Сообщение Summer.05 » 12.01.2008 (Сб) 14:18

BION
А что, если попробовать циклом от первой до последней выбрать все записи, а потом вставить их по IVSERT INTO в зависимости от индекса каждой записи в цикле?

Igor_123
Осторожный Баянист
Осторожный Баянист
Аватара пользователя
 
Сообщения: 1325
Зарегистрирован: 21.07.2004 (Ср) 13:00
Откуда: Днепропетровск

Сообщение Igor_123 » 12.01.2008 (Сб) 14:30

а эту хреновую структуру данных, нельзя ли как-то перобразовать(адаптировать) для обычного импорта?
Водки я вам не обещаю, но погуляем хорошо.
И. Сусанин.

Аватара (с) Тёмыч

BION
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 259
Зарегистрирован: 24.01.2005 (Пн) 21:05

Сообщение BION » 12.01.2008 (Сб) 15:17

Summer.05 писал(а):BION
А что, если попробовать циклом от первой до последней выбрать все записи, а потом вставить их по IVSERT INTO в зависимости от индекса каждой записи в цикле?


Ну похоже, что кроме цикла ничего другого не получится.
Прост за целостность данных переживаю, всетаки >50000, вдруг че потеряется по пути. Причем в дальнейшем операция будет повторяться много кратно.
Может конечно я зря переживаю и старина Access не подведет? Но не исключено, что база потом будет на Аракле либо на MySQL.

Igor_123
Адаптировать никак, такова уж специфика ситуации. Хотя... может через XML как-то чего-то, но я ХЗ как с этим дело обстоит у вышеперечисленных СУБД, импорт то программный получается.

Igor_123
Осторожный Баянист
Осторожный Баянист
Аватара пользователя
 
Сообщения: 1325
Зарегистрирован: 21.07.2004 (Ср) 13:00
Откуда: Днепропетровск

Сообщение Igor_123 » 12.01.2008 (Сб) 15:48

ну хорошо, массивы и коллекции,то получаются не сразу с данными, а заполняются постепенно, можно сохранять в CVS например, а сам CVS импортировать. CVS даст возможность для контрольной проверки выбранных данных и импорт будет проще, наверное :-)

на файербёрде есть такое понятие как таблицы во внешних файлах. многие этим пользуются для такого импорта в БД как у тебя, просто подставляя на место внешнего файла свой с данными и делая инсерт из него как из таблицы. у других серверов, я думаю есть похожая штука. может стоит пойти в эту сторону, если тот SQL сервер, на который планируете переход поддерживает такие вещи или похожие?
Водки я вам не обещаю, но погуляем хорошо.
И. Сусанин.

Аватара (с) Тёмыч

BION
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 259
Зарегистрирован: 24.01.2005 (Пн) 21:05

Сообщение BION » 12.01.2008 (Сб) 16:43

Igor_123
Я щас уже пытался поковыряться с Accessовским
Код: Выделить всё
... FROM TABLE IN "" [DRIVER; DATABASE=CVS/TXT Path;];

Думаю буду идти в в этих направлениях.
Большое спасибо за помощь.


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 218

    TopList