1. 程式人生 > >mysql中將自增長欄位賦值給同一個表的其它欄位

mysql中將自增長欄位賦值給同一個表的其它欄位

有一個比較奇葩的需求。

在表中增加一個欄位,在新增(匯入與手動新增)資料的時候將新增的自增長欄位賦值給另一個欄位。目的是為了相容之前的資料。

本來打算用trigger寫的,只是insert之後再update不能在同一張表中,所以就放棄了,不過也算是學習了一下觸發器,一會總結到下面。

根據關於將表中自增長欄位賦值給另外一個欄位的方法這篇文章,最終實現了需求。

為了防止原文刪除,我簡單的記錄一下:

關鍵SQL:此處關鍵在於SQL使用者具有information_schema庫查詢許可權。

SELECT Auto_increment FROM information_schema.`TABLES` WHERE  Table_Schema= '資料庫名' AND table_name = '表名'
INSERT INTO 表名(欄位1,欄位2)values ('aaa',
(SELECT Auto_increment FROM information_schema.`TABLES` WHERE Table_Schema= '資料庫名' AND table_name = '表名'));

大概就是這樣子。


最初的想法:是先查詢最大的自增欄位,再將這個值+1賦值給需要的欄位,這樣做是怕併發大了,不好處理。

第二個想法:先去新增記錄,再獲取自增欄位,再update該條記錄。

第三個想法:trigger未實現,但是粗略學習了一下。

一、語法:

delimiter $$   < 以$$開疛,再以$$結束,因為begin後面是sql語句有一個分號>

CREATE TRIGGER trigger的名稱
BEFORE INSERT ON 表名稱 FOR EACH ROW 
BEGIN
  set new.name = '123';
END $$

如果是insert的話,下面寫法可以正常的建立,但是在真正的執行新增操作時會報錯

 begin UPDATE 表名 set new.name='123' ;

[Err] 1442 - Can't update table '表名' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.)

二、檢視,刪除

SHOW   TRIGGERS

drop trigger trigger名稱

三、trigger說明

在 INSERT 型觸發器中,NEW 用來表示將要(BEFORE)或已經(AFTER)插入的新資料;
在 UPDATE 型觸發器中,OLD 用來表示將要或已經被修改的原資料,NEW 用來表示將要或已經修改為的新資料;
在 DELETE 型觸發器中,OLD 用來表示將要或已經被刪除的原資料;

OLD 是隻讀的,而 NEW 則可以在觸發器中使用 SET 賦值,這樣不會再次觸發觸發器

①如果 BEFORE 觸發器執行失敗,SQL 無法正確執行。
②SQL 執行失敗時,AFTER 型觸發器不會觸發。
③AFTER 型別的觸發器執行失敗,SQL 會回滾。