Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MySQL set default id UUID

Tags:

I'm trying to create tables in a database that has an id field that will populate the id with an UUID by default.

I tried something like:

CREATE TABLE FOO (
  id CHAR(36) PRIMARY KEY DEFAULT uuid()
);

I greatly appreciate your assistance.

like image 383
Doghouse308 Avatar asked Sep 09 '17 19:09

Doghouse308


People also ask

How do you default a column as a UUID GUID in MySQL?

DELIMITER ;; CREATE TRIGGER `foo_before_insert` BEFORE INSERT ON `foo` FOR EACH ROW BEGIN IF new.id IS NULL THEN SET new.id = uuid(); END IF; END;; DELIMITER ; This will change the default value of an INSERT statement to the uuid() value, unless it has been explicitly defined.

What is the default value for UUID?

Defined by specification as Version 5 UUID. A special case, all bits set to zero 00000000-0000-0000-0000-000000000000 . Used as a flag for an unknown UUID value. Known as a nil UUID.

Can I use UUID as primary key?

By using UUID, you can generate the primary key value of the parent table up front and insert rows into both parent and child tables at the same time within a transaction.

Can I use UUID as primary key MySQL?

The following are the advantages of using UUID for a primary key: UUID values in MySQL are unique across tables, databases, and servers. It allows us to merge rows from distributed/different databases across servers. UUID values do not provide information about our data, which means it is hard to guess.


2 Answers

MySQL 5.7, 8.0.12 and older

MySQL as of 5.7 or 8.0.12 does not support using a function or expression as the default value of a column.

The DEFAULT value clause in a data type specification indicates a default value for a column. With one exception, the default value must be a constant; it cannot be a function or an expression.

https://dev.mysql.com/doc/refman/5.7/en/data-type-defaults.html

The alternative would be to use a trigger to monitor the BEFORE INSERT of the desired table.

DELIMITER ;;
CREATE TRIGGER `foo_before_insert` 
BEFORE INSERT ON `foo` FOR EACH ROW 
BEGIN
  IF new.id IS NULL THEN
    SET new.id = uuid();
  END IF;
END;;
DELIMITER ;

This will change the default value of an INSERT statement to the uuid() value, unless it has been explicitly defined.


MySQL 8.0.13 and newer

With the release of MySQL 8.0.13 an expression can now be used as the default value, provided it is enclosed in parentheses.

Example db<>fiddle

The default value specified in a DEFAULT clause can be a literal constant or an expression. With one exception, enclose expression default values within parentheses to distinguish them from literal constant default values. The exception is that, for TIMESTAMP and DATETIME columns, you can specify the CURRENT_TIMESTAMP [constant] as the default, without enclosing parentheses.

CREATE TABLE foo (b BINARY(16)  DEFAULT (UUID_TO_BIN(UUID())));

When inserting a new row, the default value for a column with an expression default can be inserted either by omitting the column name or by specifying the column as DEFAULT (just as for columns with literal defaults):

INSERT INTO foo () VALUES();
INSERT INTO foo () VALUES(DEFAULT);

https://dev.mysql.com/doc/refman/8.0/en/data-type-defaults.html

like image 154
Will B. Avatar answered Oct 07 '22 09:10

Will B.


for Mysql version 8 and above the answer is found in; Can I use a function for a default value in MySql?

CREATE TABLE t1 (   'uuid_field' VARCHAR(32) DEFAULT (uuid());
like image 40
devcd603 Avatar answered Oct 07 '22 11:10

devcd603