Mysql
如何使用 UUID() 插入具有生成標識符的記錄?
問題
概述
所以我正在嘗試創建具有以下內容的記錄:
- id(主鍵,自增)
- 4 列,每列都是使用 MySQL 函式生成的不同 UUID
REPLACE(UUID(), '-', '')
:. 這些“混淆鍵”用於在其他表中進行外部查找。REPLACE() 用於從 MySQL 生成的 UUID 中去除破折號 (-),這是稍後將 UUID 轉換為二進制格式所必需的。請不要擔心這個!!!表結構如下:
+-----------------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------------+-------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | info | varchar(32) | YES | UNI | NULL | | | note | varchar(32) | YES | UNI | NULL | | | auth | varchar(32) | YES | UNI | NULL | | | test | varchar(32) | YES | UNI | NULL | | +-----------------+-------------+------+-----+---------+-------+
環境
OS : CentOS 7 Database : MariaDB/MySQL DB Version : 5.5
找到部分解決方案
我發現了一些似乎指向“一個方向”的文章,但是我一直無法解決這個問題。
- 插入前觸發:部分有效,但僅在第一列。MySQL 錯誤是:
Error Code: 1235. This version of MariaDB doesn't yet support 'multiple triggers with the same action time and event for one table'
還要求列允許null
預設值。似乎太多的創可貼黑客。CREATE TRIGGER before_insert_infoid BEFORE INSERT ON user FOR EACH ROW SET new.info = replace(uuid(),'-',''); CREATE TRIGGER before_insert_noteid BEFORE INSERT ON user FOR EACH ROW SET new.note = replace(uuid(),'-',''); CREATE TRIGGER before_insert_authid BEFORE INSERT ON user FOR EACH ROW SET new.auth = replace(uuid(),'-',''); CREATE TRIGGER before_insert_testid BEFORE INSERT ON user FOR EACH ROW SET new.test = replace(uuid(),'-','');
- 直接使用 insert:有效,但意味著邏輯不包含在數據庫中。另外,我收到 MySQL 警告
warning(s): 1364 Field 'id' doesn't have a default value
。INSERT INTO `meanlearn`.`students` (`info`, `note`, `auth`, `test`) VALUES (REPLACE(UUID(),'-',''), REPLACE(UUID(),'-',''), REPLACE(UUID(),'-',''), REPLACE(UUID(),'-',''));
初步結論/尋求解決方案
我確定我錯過了一些東西。非常感謝任何和所有建議。
克服多重觸發錯誤的一種方法是不使用一個觸發器(而不是 4 個)來設置新的 UUID 值:
DELIMITER // CREATE TRIGGER before_insert_on_user_set_uuids BEFORE INSERT ON user FOR EACH ROW BEGIN SET new.info = replace(uuid(),'-',''); SET new.note = replace(uuid(),'-',''); SET new.auth = replace(uuid(),'-',''); SET new.test = replace(uuid(),'-',''); END ; // DELIMITER ;
將 UUID 儲存在
BINARY(16)
列中而不是VARCHAR(32)
. 每行節省 16x4 字節(加上每行 16 乘以列上的簡單索引數)和不考慮排序規則和字元集的一些速度。而且我假設您將 varchar 列作為 ASCII 而不是 UTF-8,這將是一種真正的浪費。