Войти

Показать полную графическую версию : [MySQL]auto_increment и триггер


Kerbit
14-11-2006, 00:29
Я пишу триггер, который при добавлении записи в одну таблицу, добавляет запись в другую таблицу. При этом используется primary key добавляемого элемента. Проблема в том, что в момент добавления элемента его pk равен нулю. А как получить его реальное значение?

Sham
14-11-2006, 01:37
делай предварительный запрос на max значение ключа и ++, это на поверхности... IMHO больше никак (если правильно понял)...

vadimiron
14-11-2006, 02:44
Kerbit
Покажите код триггера

делай предварительный запрос на max значение ключа и ++, это на поверхности
Лучше руками обновление делать, чем так

Kerbit
14-11-2006, 07:36
На данный момент код триггера и определения таблиц такие:

CRETAE table tbl1 (Id_ int(32) not null auto_increment, str varchar(32) not null, primary key(Id_));
CREATE table tbl2 (Id_ int(32) not null auto_increment, Id int(32) not null, str varchar(32) not null, primary key(Id_));

CREATE TRIGGER new_tbl1 BEFORE INSERT ON tbl1
FOR EACH ROW
BEGIN
insert into tbl2 values(null, New.Id_, 'abc');
END;

При выполнении триггера New.Id_ равен 0. В этом состоит проблема.
делай предварительный запрос на max значение ключа и ++, это на поверхности...
Метод не прокатит, так как если мы добавляли записи в tbl2, а потом удалили несколько последних добавленных, то id будет вовсе не max++.
В будущем этот новый id должен внешним ключем стать для tbl2, может тогда можно как-то проще сделать?

Sham
14-11-2006, 08:44
Kerbit а если запрос на tbl1? (я чего-то не въехал пока :))

Kerbit
14-11-2006, 08:53
Kerbit а если запрос на tbl1? (я чего-то не въехал пока )
При запросе вида:
insert into tbl1 values(null, 'abc');
В tbl2 вставляются записи с id = 0. Но у новой вставленной в tbl1 записи id становится не нулевым.
PS: Я неделю назад начал писать на SQL, может я чего-то не понимаю?

XCodeR
14-11-2006, 09:40
Kerbit
read this:
http://bugs.mysql.com/bug.php?id=12482

and this:
http://rh-web-guy.livejournal.com/778.html

Sham
14-11-2006, 11:32
KerbitCREATE table tbl2 (Id_ int(32) not null auto_incrementа зачем у тебя здесь auto_increment, если значение берешь из tbl1?

Kerbit
14-11-2006, 18:05
а зачем у тебя здесь auto_increment, если значение берешь из tbl1?
Значение из tbl1 я беру для Id, а не в Id_.
XCodeR
Если я правильно понял, то это баг и он исправлен в версии 5.0.12. Но у меня 5.0.24a. Как же так получается?

XCodeR
14-11-2006, 18:30
Kerbit
возможно, глупость скажу. А last_insert_id() использовать не пробовали?

P.S. он исправлен в версии 5.0.12. Но у меня 5.0.24a. Как же так получается?
я же не знал Вашей версии MySQL.

vadimiron
14-11-2006, 19:27
Kerbit
Как сказал XCodeR, LAST_INSERT_ID() и попробуйте также CREATE TRIGGER new_tbl1 AFTER INSERT ON tbl1

Kerbit
14-11-2006, 21:43
Спасибо всем за ответы. Помогло AFTER INSERT.
LAST_INSERT_ID() не подходит, так как выдает 0 при первой вставке в каждой новой сессии работы с сервером.




© OSzone.net 2001-2012