Mysql

如何使用 UUID() 插入具有生成標識符的記錄?

  • September 7, 2016

問題

概述

所以我正在嘗試創建具有以下內容的記錄:

  1. id(主鍵,自增)
  2. 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,這將是一種真正的浪費。

引用自:https://dba.stackexchange.com/questions/149059