Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Вебмастеру (http://forum.oszone.net/forumdisplay.php?f=22)
-   -   [MySQL]auto_increment и триггер (http://forum.oszone.net/showthread.php?t=74555)

Kerbit 14-11-2006 00:29 511278

[MySQL]auto_increment и триггер
 
Я пишу триггер, который при добавлении записи в одну таблицу, добавляет запись в другую таблицу. При этом используется primary key добавляемого элемента. Проблема в том, что в момент добавления элемента его pk равен нулю. А как получить его реальное значение?

Sham 14-11-2006 01:37 511291

делай предварительный запрос на max значение ключа и ++, это на поверхности... IMHO больше никак (если правильно понял)...

vadimiron 14-11-2006 02:44 511302

Kerbit
Покажите код триггера

Цитата:

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

Kerbit 14-11-2006 07:36 511341

На данный момент код триггера и определения таблиц такие:
PHP код:

CRETAE table tbl1 (Id_ int(32not null auto_incrementstr varchar(32not nullprimary key(Id_));
   
CREATE table tbl2 (Id_ int(32not null auto_incrementId int(32not nullstr varchar(32not nullprimary 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 511358

Kerbit а если запрос на tbl1? (я чего-то не въехал пока :))

Kerbit 14-11-2006 08:53 511361

Цитата:

Kerbit а если запрос на tbl1? (я чего-то не въехал пока )
При запросе вида:
PHP код:

insert into tbl1 values(null'abc'); 

В tbl2 вставляются записи с id = 0. Но у новой вставленной в tbl1 записи id становится не нулевым.
PS: Я неделю назад начал писать на SQL, может я чего-то не понимаю?

XCodeR 14-11-2006 09:40 511389

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 511443

Kerbit
Цитата:

CREATE table tbl2 (Id_ int(32) not null auto_increment
а зачем у тебя здесь auto_increment, если значение берешь из tbl1?

Kerbit 14-11-2006 18:05 511619

Цитата:

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

XCodeR 14-11-2006 18:30 511630

Kerbit
возможно, глупость скажу. А last_insert_id() использовать не пробовали?

P.S.
Цитата:

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

vadimiron 14-11-2006 19:27 511648

Kerbit
Как сказал XCodeR, LAST_INSERT_ID() и попробуйте также CREATE TRIGGER new_tbl1 AFTER INSERT ON tbl1

Kerbit 14-11-2006 21:43 511719

Спасибо всем за ответы. Помогло AFTER INSERT.
LAST_INSERT_ID() не подходит, так как выдает 0 при первой вставке в каждой новой сессии работы с сервером.


Время: 17:41.

Время: 17:41.
© OSzone.net 2001-