[英]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.