Voglio una colonna predefinita per un GUID, quindi se sto facendo un inserimento e non imposto esplicitamente il valore, lo voglio per default su un nuovo valore GUID .valore predefinito di GUID in per una colonna in mysql
come posso fare questo?
Voglio una colonna predefinita per un GUID, quindi se sto facendo un inserimento e non imposto esplicitamente il valore, lo voglio per default su un nuovo valore GUID .valore predefinito di GUID in per una colonna in mysql
come posso fare questo?
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
$$
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.
un trigger? l'uomo è brutto :) grazie! – Blankman
+1 - Hai risposto alla mia domanda, che era completamente diversa dall'originale - ma apprezzo lo stesso! – Fenton