【问题标题】:Read and write autoincrement values from trigger从触发器读取和写入自动增量值
【发布时间】:2012-01-05 08:37:40
【问题描述】:

我在 mysql 触发器分配主键值时遇到问题。考虑一下我的桌子:

v_object : v_object_id,create_date, .. 一些通用属性
users : user_id,name, .. 用户属性

我在 users 表上有一个触发器,如下所示:

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。

我也想知道是否有一种方法可以在不指定 id 的情况下插入用户。例如:

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

它给了我一个错误,说没有指定 user_id。这是真的.. 我想做的是在触发器中创建 vobject 并生成 id。

【问题讨论】:

  • 如果不能在 INSERT 语句中省略 user_id,那么它就不是自增列。
  • user_id 不是自动递增的。它只是用户表的 pk。 vobject 的 id 是自动递增的
  • 那我有点不明白这个问题。当您没有设置显式值时,您希望 MySQL 对 users.user_id 做什么?
  • 插入语句呢?如何避免插入语句中的 user_id?
  • 请坐下来想一想:你有一个主键,你不想手动赋值,也不想让 MySQL 为你设置。那么,你想要什么? NULL 主键??

标签: mysql database triggers


【解决方案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;

【讨论】:

  • 您能解释一下我们可以预期的副作用吗?
  • 好吧,这是我的错。 dev.mysql.com/doc/refman/5.0/en/trigger-syntax.html 说,您只能拥有一个相同类型和执行时间的触发器。 Oracle 允许多个触发器,但 MySQL 不允许,谢谢
  • 插入语句呢?如何避免插入语句中的 user_id?
  • Ermmm,为什么不在你的语句中总是用静态值(即0)定义user_id?然后触发器设置一个新值。您已将 user_id 定义为 PK,PK 必须始终不为空,因此您必须将其设置在您的 INSERT
【解决方案2】:

SELECT @Result:=LAST_INSERT_ID(); 获取最后一个插入 id。

SET Result=LAST_INSERT_ID();
SELECT Result;

【讨论】:

  • SELECT in trigger 将失败,仅使用 SET
猜你喜欢
  • 2020-05-09
  • 1970-01-01
  • 1970-01-01
  • 2011-09-17
  • 2018-12-31
  • 1970-01-01
  • 1970-01-01
  • 2021-09-02
  • 1970-01-01
相关资源
最近更新 更多