当前位置: 首页 > 面试题库 >

MySQL触发器将字段更新为id的值

秦博达
2023-03-14
问题内容

我想要一个触发器来对插入的记录执行以下操作:

 # pseudocode
 if new.group_id is null
    set new.group_id = new.id
 else
    # don't touch it
 end

更清楚的说:说我有一个包含三列的表:id主键,group_id整型,valuevarchar。

当我这样插入时group_id

INSERT INTO table(value, group_id) VALUES ('a', 10)

我想拥有:

id | group_id | value
---+----------+------
 1 |       10 | a

但是当我省略时group_id

INSERT INTO table(value) VALUES ('b')

它应自动设置id为此记录的:

id | group_id | value
---+----------+------
 2 |        2 | b

扳机有可能吗?(我知道插入后可以更新记录,但使用触发器会更好。)


问题答案:

我不知道任何方法可以在一个语句中执行此操作,即使使用触发器也是如此。

@Lucky建议的触发器解决方案在MySQL中如下所示:

CREATE TRIGGER MyTrigger BEFORE INSERT ON MyTable
FOR EACH ROW BEGIN
  SET NEW.group_id = COALESCE(NEW.group_id, NEW.id);
END

但是,有一个问题。在此BEFORE INSERT阶段,id尚未生成自动生成的值。因此,如果group_id为null,则默认NEW.id为始终为0。

但是,如果您在此AFTER INSERT阶段将触发器更改为触发,那么您就可以访问的生成值NEW.id,则无法修改列值。

MySQL不支持DEFAULT列的表达式,因此您也不能在表定义中声明此行为。*更新:MySQL 8.0.13支持,DEFAULT (<expression>)表达式仍然不能依赖于自动增量值(已记录)。

唯一的解决方案是执行INSERT,然后立即执行UPDATE来更改group_id未设置的。

INSERT INTO MyTable (group_id, value) VALUES (NULL, 'a');
UPDATE MyTable SET group_id = COALESCE(group_id, id) WHERE id = LAST_INSERT_ID();


 类似资料:
  • 我有两张表“产品”和“库存”。表将包含所有产品。在库存表中,我每次都将产品的库存保存为一个新的条目。 我有两种类型的产品。“1”类型的产品将以stock作为编号,“0”类型的产品将以stock作为重量。因此,在products表中,我创建了两列“stock_weight(保持在库存表中输入的总重量)”和“pieces(保持在库存表中输入的总数量)”。 为此,我在stock表上创建了一个触发器,每当

  • userNotesTable: 用户提醒表: 插入触发器: 更新触发器: 这是数据库的当前代码,以及提醒表的特定触发器。我遇到的困难是,从提醒表中的specific中的user notes表中选择特定的名称和额外的内容,所有这些都在更新触发器中。 插入时,和会被插入到提醒和搜索表中,但我希望能够使用特定名称和用户注释表中的额外内容更新搜索表,这可能吗?

  • 如果我分别创建这两个MySQL触发器,两个触发器都执行OK。但我无法将它们组合起来,使其能够乘以持续时间x速率。 如果存在,则删除触发器;为每一行更新后创建definer=@TRIGGERSET@rate=(从语言中选择速率,其中languages.idlanguages=contracts.languages_idlanguagejes); 如果存在,则删除触发器;CREATE definer=

  • 问题内容: 我想做的是: 在我看来,该语句的语义首先是数据库将关闭,并为我确定全部中最大的价值是什么。然后,它将对该值加1,并将结果值分配给具有1、3、5、6和8 的行的列。似乎足够简单… 但是,当我尝试运行该查询时,MySQL对此kes之以鼻,说: 要获得我想要的结果,您必须使用什么秘诀? 问候,维克 问题答案: 尝试

  • 问题内容: 我有两个表,其中一个命名如下 另一个表具有以下字段: SID CID Per 如何为以下内容编写触发器: 如果表h1-h0的任何字段中发生 更新,则使用以下值更新表中的列: ((总数为1s-总数为0s / (总数1s +总数0s))/ 100 在此先感谢 我开发了一个触发器,但是它不起作用,它在第11行说了错误,您能说出什么问题吗? 问题答案: 在定义触发器之前,请确保更改定界符。另外

  • 问题内容: 我正在尝试编写触发器,我有下表:BookingRequest: 状态表: 被占领的房间: 我需要一个触发器,如果​​将具有相同ID的请求插入到OccupiedRoom表中,它将把BookingReques中的状态更改为1,所以我尝试了类似的操作 而且它不起作用,所以任何建议都非常有用 问题答案: 尝试这个: