LINUX.ORG.RU

INSERT


0

0

Нужно чтобы при добавлении строки выводился первичный ключ (id), который был присвоен этой строке.

Преподаватель подсказал использовать "RETURNING":

INSERT INTO table VALUES ("", "5", ..., 0) RETURNING id INTO p_id;

Вот что мне выводит MySQL:

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'RETURNING id INTO p_id' at line 1

Препод фанат оракла.
Поискав в гугле, можно сделать вывод что это чисто оракловская фича.

Как реализовать ее в MySQL?
Самому описывать триггер? Может есть более простой способ?

Если я прально понял, ключ autoincrement? Тогда:

"When a new AUTO_INCREMENT value has been generated, you can also obtain it by executing a SELECT LAST_INSERT_ID() statement with mysql_query() and retrieving the value from the result set returned by the statement."

babai
()

Не приходило в голову прочесть манул по INSERT'у MySQL'евскому? Я например там не нашел слова RETURNING. В Oracle нашел, в MySQL не нашел :-)

no-dashi ★★★★★
()
Ответ на: комментарий от Glam-master

На это MySQL ругается.

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'END get_table_ed' at line 1

PS двоеточие перед id я поставил.

Glam-master
() автор топика
Ответ на: комментарий от Glam-master

Кажется немного разобрался:

CREATE TRIGGER get_topic_id AFTER INSERT ON topic
FOR EACH ROW
BEGIN
SELECT NEW.id INTO id;
END;//

Говорит что переменная id неизвестна и что-то с END;// не так.
Подскажите, как вывести id в id :)

Glam-master
() автор топика
Ответ на: комментарий от Glam-master

> Говорит что переменная id неизвестна и что-то с END;// не так.
> Подскажите, как вывести id в id

Для начала, как минимум в Oracle на end;/ она сругается, поэтому
пишут обычно так:

end;
/

Во-вторых, id (в который ты делаешь INTO :-)) у тебя пытается быть
локальной переменной, что есть неверно. В Oracle я бы просто объявил
пакетную переменную, значение которой глобально для сессии. Как ты
выкрутишься в MySQL, я не знаю - не настолько хорошо с ним знаком.

P.S.: у твоего преподавателя как отчество?
И не на "А" ли имя начинается??? :-)

no-dashi ★★★★★
()
Ответ на: комментарий от Glam-master

Нет, не знакомы. Просто очень уж знакомые приемы - триггеры, INSERT INTO ... VALUES ... RETURNING field INTO variable :-)

no-dashi ★★★★★
()
Ответ на: комментарий от geekkoo

> last_insert_id

А как он отработает в нетранзакционном окружении или в параллельном выполнении? Кстати - заодно и проверю :-)

no-dashi ★★★★★
()

На perl я делал так:

$st->prepate('INSERT ...'); $st->execute(...);

$id = $st->{mysql_insert_id};

Legioner ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.