gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 12:26:22 25 4
gpt4 key购买 nike

在插入值表时,有必要将自动增量字段更改为另一个,并且这些表中没有两个相同的 id。有必要根据记录从第三表输出数据,并且不向该表添加一列指示。这是我的触发器,但它不起作用

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

最佳答案

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

但是听起来好像您有两个表,其 id列,并且您希望确保 id 的值相同两个表中均未使用。也就是说,如果id42存在于 table1 ,您要确保42不用作idtable2 .

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

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

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

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

然后,我们删除 AUTO_INCREMENT来自 id 的属性我们想要生成不同的两个表的列 id值。

对于这些表,我们将创建 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最大的行即可值(value)。

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

关于mysql - 如何更改MySQL表触发器中的auto_increment字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28249224/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com