簡體   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