這兩天在思考怎么生成數據庫隨機名稱,思前想后覺得還是利用自增的邏輯主鍵是最方便快捷的,於是便嘗試着獲取一種自增的mysql函數
自增mysql函數
1 BEGIN 2 DECLARE id INT DEFAULT 0; 3 SELECT cuid + 1 INTO id from uc_gen_number where table_key = tableKey for update; 4 IF id = 0 THEN 5 SET id = 1; 6 INSERT INTO uc_gen_number (table_key, cuid) VALUES (tableKey, id); 7 ELSE UPDATE uc_gen_number SET cuid = id where table_key = tableKey; 8 END IF; 9 RETURN id; 10 END
查資料的時候看到了這個函數,覺得真的是刷新了我的三觀,之前一直認為select出的結果集是不能夠賦值給其他的,因為考慮畢竟是一個集合,但是今天發現卻可以,只要保證結果集只有一條。
自己嘗試着驗證了這個原理:
update User set FSerialID=(select FSerialId from (select FSerialId from User ORDER BY FSerialId desc limit 1) a) where FSerialId=(select FSerialId from (select FSerialId from User ORDER BY FSerialId asc limit 1) b)
沒想到真的可以。如果把select FSerialId from (select FSerialId from UserInfo ORDER BY FSerialId desc limit 1) a 這句直接改成select FSerialId from UserInfo ORDER BY FSerialId desc limit 1。會報錯You can't specify target table <tbl> for update in FROM clause.錯誤的意思是說,不能先select出同一表中的某些值,再update這個表(在同一語句中)。