【问题标题】:MYSQL Trigger to insert column value in same tableMYSQL触发器在同一个表中插入列值
【发布时间】:2016-10-03 10:23:59
【问题描述】:

我有一个 mysql Innodb 表 'classrooms_subjects'

id|classroom_id|subject_id

classroom_id 和 subject_id 是复合键。每当我插入带有教室 ID 和主题 ID 的行时,我的 id 字段都会插入为 0。

现在我想创建一个触发器,它将输入 id 字段作为 last_inserted_id()+1。

我还需要处理一次插入的多条记录。我的触发器如下:

CREATE TRIGGER `increment_id` AFTER INSERT ON `classrooms_subjects`
 FOR EACH ROW BEGIN
UPDATE classrooms_subjects
SET classrooms_subjects.id = LAST_INSERT_ID() + 1 WHERE id=0;
END

当我插入一条记录时,我收到以下错误: "无法更新触发器中的表,因为它已被调用此触发器的语句使用

【问题讨论】:

  • 使用auto_increment 列。
  • 2 列由复合键组成,因此 mysql 不允许创建另一列作为自动增量
  • 您可以将自增列定义为主键,并将该对定义为唯一的非空键。

标签: mysql triggers


【解决方案1】:

一般信息:在触发器中使用更新语句是不对的。

最好使用插入前触发器,并使用 NEW.id 简单地分配列的值

http://dev.mysql.com/doc/refman/5.7/en/trigger-syntax.html

以 OLD 命名的列是只读的。你可以参考它(如果你有 SELECT 权限),但不能修改它。 您可以参考一个专栏 如果您有它的 SELECT 权限,则用 NEW 命名。在之前 触发器,您也可以使用 SET NEW.col_name = value 更改其值 如果你有它的更新权限。这意味着您可以使用 触发器修改要插入新行或用于 更新一行。(这样的 SET 语句在 AFTER 中无效 触发,因为行更改已经发生。)

您可能应该构建表格以使 auto_increment 正常工作。当多个会话一次插入数据库时​​更好的解决方案。

【讨论】:

    猜你喜欢
    • 2023-04-09
    • 2015-08-18
    • 2015-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-20
    相关资源
    最近更新 更多