ПрограммированиеФорумОбщее

MySql Хранимые функции

#0
19:51, 9 мая 2011

Здравствуйте.
Кто знает, как можно получить row  в хранимой функции в запросе INSERT INTO. Нужно примерно следующее:

BEGIN
     
  SET @res = INSERT INTO users  (`name`) VALUES(_name);

  RETURN @res.id;
END

#1
20:56, 9 мая 2011

Напиши триггер, который будет вызывать SELECT после INSERT'а, и выдавать тебе результат.
Либо, если это только ID, то получай последний ID:
SET @lastId = (SELECT MAX(id) FROM users)
RETURN @lastId
Вроди так.

ЗЫ, название темы, не отображает вопроса.
Также важность тут не уместна, уважайте других разработчиков, и не думайте что ваши потребности выше чужих.

#2
21:23, 9 мая 2011

>>Напиши триггер, который будет вызывать SELECT после INSERT'а, и выдавать тебе результат.
>>SET @lastId = (SELECT MAX(id) FROM users)
>>RETURN @lastId
Тогда(при любом селекте) нужно лочить доступ к таблице, поэтому изначально отказался от этой идеи.
Может еще есть какие-то варианты?

#3
22:58, 9 мая 2011

А генераторов в мускле нету? В фаирберде автоинкрементные поля заполняются триггером. Что-то типа:

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
#4
0:56, 10 мая 2011

Используй автоинкремент

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)

#5
12:00, 10 мая 2011

Zoobastik  Спасибо, LAST_INSERT_ID помогло.

#6
14:44, 10 мая 2011

Zoobastik
> LAST_INSERT_ID
А если нет гарантии, что между инсертом и прочиткой LAST_INSERT_ID не проскочит другого инсерта?

#7
15:04, 10 мая 2011

Кривой этот ваш mySQL, ой кривой. Все на каких-то экстеншонах и отсебятине держится.

user_id int(11), AUTO_INCREMENT, LAST_INSERT_ID лол. Еще я слышал у вас есть 3х-байтные интежеры :)

#8
15:19, 10 мая 2011

entryway
> Кривой этот ваш mySQL, ой кривой :) Все на каких-то экстеншонах и отсебятине
> держится.
Да уж...
INSERT INTO ... RETURNING id, как в PostgreSQL гораздо как посимпатичнее будет.

#9
15:24, 10 мая 2011

serpinf
> INSERT INTO ... RETURNING id, как в PostgreSQL гораздо как посимпатичнее будет.
В фаирберде такой же синтаксис

#10
15:56, 10 мая 2011

А если нет гарантии, что между инсертом и прочиткой LAST_INSERT_ID не проскочит другого инсерта?
Вероятность очень мала, но все же это пока лучший способ.

#11
16:20, 10 мая 2011

LAST_INSERT_ID, не будет конфликтовать с другими соединениями. Если он вызвался в течении одной сессии, то не может быть изменён другими сессиями.
Так что использовать его нужно не всегда.

#12
16:44, 10 мая 2011

> Вероятность очень мала, но все же это пока лучший способ.
Что за ересь. Нет никакой малой вероятности.
LAST_INSERT_ID для текущего соединения храниться отдельно. И даже если в другой сессии произойдет INSERT, то текущее значение останется неизменным.

ПрограммированиеФорумОбщее

Тема в архиве.