Здравствуйте.
Кто знает, как можно получить row в хранимой функции в запросе INSERT INTO. Нужно примерно следующее:
BEGIN
SET @res = INSERT INTO users (`name`) VALUES(_name);
RETURN @res.id;
END
Напиши триггер, который будет вызывать SELECT после INSERT'а, и выдавать тебе результат.
Либо, если это только ID, то получай последний ID:
SET @lastId = (SELECT MAX(id) FROM users)
RETURN @lastId
Вроди так.
ЗЫ, название темы, не отображает вопроса.
Также важность тут не уместна, уважайте других разработчиков, и не думайте что ваши потребности выше чужих.
>>Напиши триггер, который будет вызывать SELECT после INSERT'а, и выдавать тебе результат.
>>SET @lastId = (SELECT MAX(id) FROM users)
>>RETURN @lastId
Тогда(при любом селекте) нужно лочить доступ к таблице, поэтому изначально отказался от этой идеи.
Может еще есть какие-то варианты?
А генераторов в мускле нету? В фаирберде автоинкрементные поля заполняются триггером. Что-то типа:
create trigger table01_bi for table01
active before insert position 0
as
begin
if (new.id is null) then
new.id = gen_id(table01_gen, 1);
endПри инсерте в хранимой процедуре если нужно вернуть это поле, делаем так:
create procedure table01_insert (in_name varchar(50)) returns (out_id integer) as begin out_id = gen_id(table01_gen, 1); insert into tale01(id, name) values (out_id, :in_name); end
Используй автоинкремент
create table users ( user_id int(11) NOT NULL AUTO_INCREMENT, name varchar(...
Чтобы узнать идентификатор вставленной строки, используй вызов LAST_INSERT_ID (http://www.mysql.ru/docs/man/Miscellaneous_functions.html)
Zoobastik Спасибо, LAST_INSERT_ID помогло.
Zoobastik
> LAST_INSERT_ID
А если нет гарантии, что между инсертом и прочиткой LAST_INSERT_ID не проскочит другого инсерта?
Кривой этот ваш mySQL, ой кривой. Все на каких-то экстеншонах и отсебятине держится.
user_id int(11), AUTO_INCREMENT, LAST_INSERT_ID лол. Еще я слышал у вас есть 3х-байтные интежеры :)
entryway
> Кривой этот ваш mySQL, ой кривой :) Все на каких-то экстеншонах и отсебятине
> держится.
Да уж...
INSERT INTO ... RETURNING id, как в PostgreSQL гораздо как посимпатичнее будет.
serpinf
> INSERT INTO ... RETURNING id, как в PostgreSQL гораздо как посимпатичнее будет.
В фаирберде такой же синтаксис
А если нет гарантии, что между инсертом и прочиткой LAST_INSERT_ID не проскочит другого инсерта?
Вероятность очень мала, но все же это пока лучший способ.
LAST_INSERT_ID, не будет конфликтовать с другими соединениями. Если он вызвался в течении одной сессии, то не может быть изменён другими сессиями.
Так что использовать его нужно не всегда.
> Вероятность очень мала, но все же это пока лучший способ.
Что за ересь. Нет никакой малой вероятности.
LAST_INSERT_ID для текущего соединения храниться отдельно. И даже если в другой сессии произойдет INSERT, то текущее значение останется неизменным.
Тема в архиве.