2012-01-05 3 views
1

У меня возникают проблемы с триггерами mysql, задающими значения первичного ключа. Рассмотрим мои таблицы:Чтение и запись значений автоинкремента из триггера

v_object: v_object_id, create_date, .. некоторые общие атрибуты
пользователи: user_id, имя, .. атрибуты пользователя

У меня есть триггер на таблицу пользователей следующим образом :

create trigger new_vobject_for_user before insert on users 
for each row begin 
    insert into v_object(v_type,...) values(...); 
    set NEW.id = // How do i get the new v_object's id here? 
end; 

Когда я вставить пользователь, мне нужен vobject создал и использовать свое новое авто увеличивается значение для user_id.

Я также хотел бы знать, есть ли способ вставить пользователей без указания идентификатора. Например:

insert into users(n1,n2,n3,...) values(m1,m2,m3,...); 

Это дает мне сообщение о том, что user_id не указан. И это правда .. то, что я пытаюсь сделать, это создать vobject & сгенерировать идентификатор в триггере.

+0

Если вы не можете пропустить 'user_id' в операторе INSERT, то это не столбец автоинкремент. –

+0

user_id не является автоматическим приращением .. его просто pk таблицы пользователей. Идентификатор vobject является автоматическим приращением –

+0

Тогда я не понимаю эту часть вопроса. Что вы хотите, чтобы MySQL работал с 'users.user_id', когда вы не устанавливаете явное значение? –

ответ

1

использование LAST_INSERT_ID()

create trigger new_vobject_for_user before insert on users 
for each row begin 
    insert into v_object(v_type,...) values(...); 
    set NEW.id = LAST_INSERT_ID(); 
end; 

альтернативно посмотреть на INFORMATION_SCHEMA таблиц и получить последний автоматическое приращение для таблицы v_object

create trigger new_vobject_for_user before insert on users 
for each row begin 
    insert into v_object(v_type,...) values(...); 
    set NEW.id = (SELECT AUTO_INCREMENT FROM information_schema.TABLES 
     WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'v_object') 
end; 
+1

Не могли бы вы объяснить, какие побочные эффекты мы можем ожидать? –

+0

ОК, это была моя ошибка. http://dev.mysql.com/doc/refman/5.0/ru/trigger-syntax.html говорит, что у вас может быть только один триггер того же типа и время выполнения. Oracle предлагает несколько триггеров, но не MySQL, спасибо – rabudde

+0

Как насчет инструкции insert? как я могу избежать user_id в инструкции insert? –

1

SELECT @Result:=LAST_INSERT_ID(); получить последний вставки идентификатора.

или

SET Result=LAST_INSERT_ID(); 
SELECT Result; 
+0

'SELECT' в триггере, который завершится с ошибкой, используйте только' SET' – rabudde

Смежные вопросы