繁体   English   中英

如何在MySQL中的表触发器中更改auto_increment字段?

[英]How to change the auto_increment field in a table trigger in MySQL?

插入值表中以将自动递增字段更改为另一个值时,这些表中没有两个相同的ID是必要的。 对于基于记录的从第三表输出的数据,有必要不向表中添加一列指示。 这是我的触发器,但是不起作用

CREATE TRIGGER `update_id` AFTER INSERT ON `table1`
FOR EACH ROW BEGIN
ALTER TABLE `table2` AUTO_INCREMENT = NEW.id;
END;

尚不清楚您要解决什么问题。

但这听起来好像您有两个带有id列的表,并且您想确保两个表中都没有使用相同id值。 也就是说,如果表table1存在id42table1确保在table2不将42用作id值。

不幸的是,MySQL没有为此提供任何声明性约束。

听起来好像您想要一个Oracle风格的SEQUENCE对象。 不幸的是,MySQL没有提供等效功能。

但是我们可以做的就是模仿。 创建一个额外的“序列”表,其中包含一个AUTO_INCREMENT列。 该表的目的是用于生成id值,并跟踪生成的最高id值:

CREATE TABLE mysequence (id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY);

然后,从要为其生成不同id值的两个表的id列中删除 AUTO_INCREMENT属性。

对于这些表,我们将创建BEFORE INSERT触发器,该触发器将获取不同的id值并将其分配给id列。 要生成唯一值,我们可以在新的mysequence表中插入一行,然后使用LAST_INSERT_ID函数检索auto_increment值。

像这样:

CREATE TRIGGER table1_bi
BEFORE INSERT ON table1
FOR EACH ROW
BEGIN
   DECLARE generated_id INT UNSIGNED;
   -- do we need to generate a value for id column?
   IF NEW.id IS NULL THEN
      -- generate unique id value with insert into sequence table
      INSERT INTO mysequence (id) VALUES (NULL);
      -- retrieve inserted id value 
      SELECT LAST_INSERT_ID() INTO generated_id;
      -- assign the retrieved value to the id columns of the row being inserted
      SET NEW.id = generated_id;
   END IF
END$$

(这只是一个粗略的概述,可能某处至少存在一个语法错误。)

您需要为每个表创建一个BEFORE INSERT触发器。

这是一种为id列生成不同值的方法。

请注意,不必将所有行保留在mysequence表中,只需保留具有最大id值的行。

还要注意,这对两个表都没有施加任何约束。 某些会话可以提供另一个表中已有的id值。 为避免这种情况,如果提供了非NULL id值,则触发器可能会引发错误。 也可能允许非NULL值,并执行查询以检查提供的id值是否已存在于另一个表中,如果存在则引发错误。 但是该查询将受到竞争条件的影响...两个并发会话在表中进行插入,并且您需要实现一些并发终止锁定机制以防止并发插入。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM