[英]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
存在id
值42
, table1
确保在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.