один insert на несколько записей

Модераторы: kdv, CyberMax

Ответить
ky4er
Сообщения: 18
Зарегистрирован: 26 июл 2007, 18:00

один insert на несколько записей

Сообщение ky4er » 08 авг 2007, 13:25

Здравствуйте
Есть ли возможность вставки нескольких записей одним запросом insert в firebird 2.0?

stix-s
Заслуженный разработчик
Сообщения: 557
Зарегистрирован: 13 дек 2005, 11:52

Re: один insert на несколько записей

Сообщение stix-s » 08 авг 2007, 13:44

ky4er писал(а):Здравствуйте
Есть ли возможность вставки нескольких записей одним запросом insert в firebird 2.0?
Да, есть

ky4er
Сообщения: 18
Зарегистрирован: 26 июл 2007, 18:00

Сообщение ky4er » 08 авг 2007, 13:48

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

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 08 авг 2007, 14:43

Код: Выделить всё

insert into Table1 (id, field1, ..., fieldN)
select id, field_1, ..., field_N
  from Table2

ky4er
Сообщения: 18
Зарегистрирован: 26 июл 2007, 18:00

Сообщение ky4er » 08 авг 2007, 14:54

спасибо но только это не то немного.
мне не нужно выбирать данные для вставки из другой базы. данные подготовленны в программе. осталось только их добавить. вроде должен работать запрос типа
insert into TABLE (FIELD) values (VALUE1), (VALUE2), (VALUE3), ...
но вот только он не воспринимается. не может разобрать запятую после (VALUE1). Может я не правильно что то делаю

stix-s
Заслуженный разработчик
Сообщения: 557
Зарегистрирован: 13 дек 2005, 11:52

Сообщение stix-s » 08 авг 2007, 15:23

ky4er писал(а):спасибо но только это не то немного.
мне не нужно выбирать данные для вставки из другой базы. данные подготовленны в программе. осталось только их добавить. вроде должен работать запрос типа
insert into TABLE (FIELD) values (VALUE1), (VALUE2), (VALUE3), ...
но вот только он не воспринимается. не может разобрать запятую после (VALUE1). Может я не правильно что то делаю
угу, непрально, не выйдет фокус
скажи мне, кстати, где выйдет, я посмотрю на это чудо

ky4er
Сообщения: 18
Зарегистрирован: 26 июл 2007, 18:00

Сообщение ky4er » 08 авг 2007, 15:26

рялом со мной седит мой коллега и говорит что это типо стандарт sql и в mysql и postgres все катит

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 08 авг 2007, 17:38

Два варианта.

Код: Выделить всё

insert into Table (id, val)
select * from
(
select 1 as id, 1 as val from rdb$database
union all
select 2, 2 from rdb$database
union all
select 3, 3 from rdb$database
)

Код: Выделить всё

execute block as begin
  insert into Table (id, val) values (1, 1);
  insert into Table (id, val) values (2, 2);
  insert into Table (id, val) values (3, 3);
end
Оба для сервера являются "одним запросом".
А вообще, при переливании из базы в базу, если не суперкритична скорость заливки,

Код: Выделить всё

insert into Table (id, val) values (:param1, :param2);
и вперёд по одной записи, подставляя только значения параметров.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 09 авг 2007, 08:01

седит мой коллега и говорит что это типо стандарт sql
пусть типо не свистит.

p.s. за коверкание русского языка отрублю нафиг. На форуме было предупреждение, что сюда можно людям только старше 13 лет ходить.

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 09 авг 2007, 09:36

kdv писал(а):пусть типо не свистит.
Да? Хм. Мне казалось, что ещё в SQL92 написано, что списков значений для VALUES может быть несколько.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 09 авг 2007, 12:11

тогда я неправ. хотя особого смысла я в такой конструкции не вижу.

stix-s
Заслуженный разработчик
Сообщения: 557
Зарегистрирован: 13 дек 2005, 11:52

Сообщение stix-s » 09 авг 2007, 13:36

ky4er писал(а):рялом со мной седит мой коллега и говорит что это типо стандарт sql и в mysql и postgres все катит
пусть коллега скажет тогда в каком именно стандарте SQL, ибо все меняется, посмотрю, мож пригодится где, хотя, врядли, циклы еще никто не отменял :)
ЗЫ Насчет MySQL не знаю, но MS SQL 2000 не кушает подобное
INSERT INTO T501PTR (Code_Client)
VALUES('0','20')
Server: Msg 110, Level 15, State 2, Line 2
There are fewer columns in the INSERT statement than values specified in the VALUES clause. The number of values in the VALUES clause must match the number of columns specified in the INSERT statement.
и в BOL не нашел ничего

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 09 авг 2007, 15:16

stix-s писал(а):пусть коллега скажет тогда в каком именно стандарте SQL
Я уже написал. Сейчас специально посмотрел - SQL92, уровень выше Entry.
"за предложением VALUES может следовать один или несколько списков значений в скобках, и каждый такой список составляет включаемую строку."
stix-s писал(а):INSERT INTO T501PTR (Code_Client)
VALUES('0','20')
Ты неправильно пишешь.
Надо так:

Код: Выделить всё

INSERT INTO T501PTR (Code_Client)
VALUES ('0'),('20')
Хотя, я тут не совсем понял, но кажись, если из одного поля, то можно без скобок вообще, т.е. VALUES '0', '20'.
В скобки обязательно заключаются только конструкторы из более чем одного элемента.

mdfv
Сообщения: 119
Зарегистрирован: 23 май 2006, 15:53

Сообщение mdfv » 09 авг 2007, 15:31

Извиняюсь, что не в тему, а где можно найти непосредственно сами исходные не переиначеные комментаторами сборники стандартов SQL?
Они в открытом доступе как rfc вообще есть?

stix-s
Заслуженный разработчик
Сообщения: 557
Зарегистрирован: 13 дек 2005, 11:52

Сообщение stix-s » 10 авг 2007, 07:03

WildSery писал(а):
stix-s писал(а):пусть коллега скажет тогда в каком именно стандарте SQL
Я уже написал. Сейчас специально посмотрел - SQL92, уровень выше Entry.
"за предложением VALUES может следовать один или несколько списков значений в скобках, и каждый такой список составляет включаемую строку."
Что-то я не углядел :( буду перечитывать
тут смотрел
http://savage.net.au/SQL/sql-92.bnf.html
WildSery писал(а):
stix-s писал(а):INSERT INTO T501PTR (Code_Client)
VALUES('0','20')
Ты неправильно пишешь.
Надо так:

Код: Выделить всё

INSERT INTO T501PTR (Code_Client)
VALUES ('0'),('20')
Хотя, я тут не совсем понял, но кажись, если из одного поля, то можно без скобок вообще, т.е. VALUES '0', '20'.
В скобки обязательно заключаются только конструкторы из более чем одного элемента.
Правильно, прально, описание ошибки четкое в моем случае, иначе просто
Line 2: Incorrect syntax near ....
:)

mdfv
Сообщения: 119
Зарегистрирован: 23 май 2006, 15:53

Сообщение mdfv » 10 авг 2007, 10:15

Путем логических измышлений можно прийти к некому выводу...
<insert statement> ::= INSERT INTO <table name> <insert columns and source>

<insert columns and source> ::= [ <left paren> <insert column list> <right paren> ] <query expression>
<query expression> ::= <non-join query expression>

<non-join query expression> ::= <non-join query term>
<non-join query term> ::= <non-join query primary>
<non-join query primary> ::= <simple table>

<simple table> ::= <table value constructor>
<table value constructor> ::= VALUES <table value constructor list>

<table value constructor list> ::= <row value constructor> [ { <comma> <row value constructor> }... ]
<row value constructor> ::= <row value constructor element> | <left paren> <row value constructor list> <right paren>
<row value constructor list> ::= <row value constructor element> [ { <comma> <row value constructor element> } ... ]
<row value constructor element> ::= <value expression>

Ответить