2010-10-30 8 views

risposta

9

Essendo che UUID() non è accettato come vincolo DEFAULT, è necessario utilizzare un trigger.

Questo si imposta il valore per la colonna NEW_TABLE.uuid:

delimiter $$ 

CREATE 
DEFINER=`root`@`localhost` 
TRIGGER `example`.`newid` 
BEFORE INSERT ON `example`.`new_table` 
FOR EACH ROW 
BEGIN 
    SET NEW.`uuid` = UUID(); 
END 
$$ 
+1

un trigger? l'uomo è brutto :) grazie! – Blankman

+0

+1 - Hai risposto alla mia domanda, che era completamente diversa dall'originale - ma apprezzo lo stesso! – Fenton

8

Previous answer non è giusto - hai avuto modo di stare attenti con i trigger ... essi saranno effettivamente sovrascrivere alcun valore predefinito si passa a se usato come in quell'esempio. Tutto funzionerà correttamente quando la chiave primaria non è impostata, ma se ne passi uno con INSERT, verrà cancellata con una nuova casuale dal trigger.

Per farlo funzionare correttamente è necessario verificare se il campo ha già un valore prima di assegnare uno nuovo, come segue:

DELIMITER ;; 
CREATE TRIGGER `sometrigger` 
BEFORE INSERT ON `sometable` 
FOR EACH ROW 
BEGIN 
    IF ASCII(NEW.uuid) = 0 THEN 
     SET NEW.uuid = UNHEX(REPLACE(UUID(),'-','')); 
    END IF; 
    SET @last_uuid = NEW.uuid; 
END 
;; 

Io uso ASCII() per controllare il nuovo valore del campo, come ASCII() tornerà 0 per una stringa vuota se i dati sono in formato testuale o binario (e una stringa vuota è il valore predefinito per i campi senza impostazione predefinita). Io uso anche binario (16) per archiviare i miei UUID per lo spazio di archiviazione e la velocità di query più efficienti ... se non vuoi affrontare la complessità dei campi binari, puoi semplicemente usare UUID() al posto di UNHEX(REPLACE(UUID(),'-','')) con un char (36) campo.