Страница 1 из 1
один insert на несколько записей
Добавлено: 08 авг 2007, 13:25
ky4er
Здравствуйте
Есть ли возможность вставки нескольких записей одним запросом insert в firebird 2.0?
Re: один insert на несколько записей
Добавлено: 08 авг 2007, 13:44
stix-s
ky4er писал(а):Здравствуйте
Есть ли возможность вставки нескольких записей одним запросом insert в firebird 2.0?
Да, есть
Добавлено: 08 авг 2007, 13:48
ky4er
ага. а каким должен быть формат запроса на втавку?
Добавлено: 08 авг 2007, 14:43
WildSery
Код: Выделить всё
insert into Table1 (id, field1, ..., fieldN)
select id, field_1, ..., field_N
from Table2
Добавлено: 08 авг 2007, 14:54
ky4er
спасибо но только это не то немного.
мне не нужно выбирать данные для вставки из другой базы. данные подготовленны в программе. осталось только их добавить. вроде должен работать запрос типа
insert into TABLE (FIELD) values (VALUE1), (VALUE2), (VALUE3), ...
но вот только он не воспринимается. не может разобрать запятую после (VALUE1). Может я не правильно что то делаю
Добавлено: 08 авг 2007, 15:23
stix-s
ky4er писал(а):спасибо но только это не то немного.
мне не нужно выбирать данные для вставки из другой базы. данные подготовленны в программе. осталось только их добавить. вроде должен работать запрос типа
insert into TABLE (FIELD) values (VALUE1), (VALUE2), (VALUE3), ...
но вот только он не воспринимается. не может разобрать запятую после (VALUE1). Может я не правильно что то делаю
угу, непрально, не выйдет фокус
скажи мне, кстати, где выйдет, я посмотрю на это чудо
Добавлено: 08 авг 2007, 15:26
ky4er
рялом со мной седит мой коллега и говорит что это типо стандарт sql и в mysql и postgres все катит
Добавлено: 08 авг 2007, 17:38
WildSery
Два варианта.
Код: Выделить всё
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);
и вперёд по одной записи, подставляя только значения параметров.
Добавлено: 09 авг 2007, 08:01
kdv
седит мой коллега и говорит что это типо стандарт sql
пусть типо не свистит.
p.s. за коверкание русского языка отрублю нафиг. На форуме было предупреждение, что сюда можно людям только старше 13 лет ходить.
Добавлено: 09 авг 2007, 09:36
WildSery
kdv писал(а):пусть типо не свистит.
Да? Хм. Мне казалось, что ещё в SQL92 написано, что списков значений для VALUES может быть несколько.
Добавлено: 09 авг 2007, 12:11
kdv
тогда я неправ. хотя особого смысла я в такой конструкции не вижу.
Добавлено: 09 авг 2007, 13:36
stix-s
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 не нашел ничего
Добавлено: 09 авг 2007, 15:16
WildSery
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'.
В скобки обязательно заключаются только конструкторы из более чем одного элемента.
Добавлено: 09 авг 2007, 15:31
mdfv
Извиняюсь, что не в тему, а где можно найти непосредственно сами исходные не переиначеные комментаторами сборники стандартов SQL?
Они в открытом доступе как rfc вообще есть?
Добавлено: 10 авг 2007, 07:03
stix-s
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 ....

Добавлено: 10 авг 2007, 10:15
mdfv
Путем логических измышлений можно прийти к некому выводу...
<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>