[SQL] insert в связанные таблицы

rfgbnfy

ещё 1 ламерский вопрос (под утро всегда голова хреново работает) ................
есть 2 таблицы .
в первой - поле ID , primary key , тип serial (bigint с прикрученной секвенцией) .
во второй таблице - поле IDT - foreign key .
надо вставить в первую таблицу строчку и несколько строк во вторую , соответствующих (idt=id) .
в общем проблемма в том что при вставке в первую таблицу строчки я не знаю с каким id она вставилась . и соответственно без дополнительного запроса не могу заполнить вторую таблицу . можно ли как нибудь избежать этого промежуточного запроса ?

sergei1969

>в общем проблемма в том что при вставке в первую таблицу строчки я не знаю с каким id она вставилась
MySQL - mysql_insert_id вернёт тебе последний сгенерённый при вставке id
Oracle - insert ....... returning ID into <var>
для mssql не знаю, думаю примерно как для ora

rfgbnfy

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

sergei1969

ты хочешь всё вставить одним оператором?

rfgbnfy

ну если извратится - то 2 получится . хотя это изврат , проще процедуру под это написать ...............

daru

В MS'е @@IDENTITY, SCOPE_IDENTITY и IDENT_CURRENT.
см можно тут
P.S. По-моему, для серьезных БД типа Orы и Msа дОлжно тут писать stored procedure. Будет очень быстро и концептуально: конечный пользователь не будет даже знать, что он что-то вставил в 2 таблицы. Могу добравшись до дому с работы, подкинуть примерчик, если кто попросит.

rfgbnfy

1) конечный пользователь - я . дальше меня - только девочки-секретутки ...................
2) процедуру конечно написатьне проблемма , но не стоит этот проект того ................да и непонятно какая там база на хостинге . но всё равно хочется сделать не как всегда - а как лучше . вот испрашиваю можно ли это сделать стандартными средствами ...................
ЗЫ а узнать последнее значение секвенции - самое "базо"-независимое - использовать "max" .

stm7481822

А что, можно получить IDшник последней вставленной записи в одном запросе, без второго (MAX?
Я про mysql_insert_id... Какой формат использования?

Sanjaz

В MSSQL:
SELECT @@IDENTITY

Maverick-I

ЗЫ а узнать последнее значение секвенции - самое "базо"-независимое - использовать "max" .

Ага, особенно если между твоими запросами из другой сессии инсерт сделают. Фпирёд.

daru

да и непонятно какая там база на хостинге

lol
тогда не судьба тебе завершить этот "проект" imho
а узнать последнее значение секвенции - самое "базо"-независимое - использовать "max"

rofl
это будет работать, только если гарантировать отсутствие параллельных изменений этой же таблицы из других сессий/потоков. Для некоторых проектов это, наверное, выполнено...

Marinavo_0507

> это будет работать, только если гарантировать отсутствие параллельных изменений этой же таблицы из других сессий/потоков. Для некоторых проектов это, наверное,
> выполнено...
заметим, что в этом случае возможны более простые и эффективные решения

Realist

В Oracle:
Max будет работать, если таблица непуста. Иначе null вернет.
Маза завсети последовательность и сделать два insert`а:
один вставляет в таблицу с primary key со значением NEXT_VAL последовательности,
а второй вставляет в таблицу с FK со значением CURR_VAL
Еще фича про хранимую процедуру. Маза сделать представление из этих вдух таблиц и повесить trigger на добавление записи. Будет децл пальцастей, чем с хранимой процедурой
Оставить комментарий
Имя или ник:
Комментарий: