Appearance
Generate UUID in MySQL
MySQL provides built-in UUID generation through the UUID()
function, which generates version 1 UUIDs. Here's how to use it:
sql
-- Generate UUID version 1 (time-based)
SELECT UUID();
-- Result: 6ccd780c-baba-1026-9564-5b8c656024db
-- Generate multiple UUIDs
SELECT UUID() as uuid1, UUID() as uuid2, UUID() as uuid3;
MySQL's UUID()
function generates version 1 UUIDs by default. For other versions, you'll need custom functions or generate UUIDs in your application:
sql
-- MySQL built-in UUID (version 1 only)
SELECT UUID() as uuid_v1;
-- For UUID v4, you can create a custom function
DELIMITER //
CREATE FUNCTION UUID_V4()
RETURNS CHAR(36)
READS SQL DATA
DETERMINISTIC
BEGIN
RETURN LOWER(CONCAT(
HEX(RANDOM_BYTES(4)),
'-',
HEX(RANDOM_BYTES(2)),
'-',
'4',
SUBSTR(HEX(RANDOM_BYTES(2)), 2),
'-',
CONCAT(
CASE
WHEN (CONV(SUBSTR(HEX(RANDOM_BYTES(1)), 1, 1), 16, 10) & 3) | 8 = 8 THEN '8'
WHEN (CONV(SUBSTR(HEX(RANDOM_BYTES(1)), 1, 1), 16, 10) & 3) | 8 = 9 THEN '9'
WHEN (CONV(SUBSTR(HEX(RANDOM_BYTES(1)), 1, 1), 16, 10) & 3) | 8 = 10 THEN 'a'
ELSE 'b'
END,
SUBSTR(HEX(RANDOM_BYTES(1)), 2)
),
'-',
HEX(RANDOM_BYTES(6))
));
END//
DELIMITER ;
-- Use custom UUID v4 function
SELECT UUID_V4() as uuid_v4;
Table Schema with UUID Primary Keys
Basic UUID table setup:
sql
-- Using CHAR(36) for readability
CREATE TABLE users (
id CHAR(36) PRIMARY KEY DEFAULT (UUID()),
name VARCHAR(100) NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- Insert data (UUID generated automatically)
INSERT INTO users (name, email)
VALUES ('John Doe', '[email protected]');
-- Query with UUID
SELECT * FROM users WHERE id = '6ccd780c-baba-1026-9564-5b8c656024db';
Optimized UUID storage with BINARY:
sql
-- Using BINARY(16) for better performance (MySQL 8.0+)
CREATE TABLE orders (
id BINARY(16) PRIMARY KEY DEFAULT (UUID_TO_BIN(UUID())),
user_id BINARY(16) NOT NULL,
order_number VARCHAR(50),
total DECIMAL(10,2),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
INDEX idx_user_id (user_id)
);
-- Insert with binary UUID
INSERT INTO orders (id, user_id, order_number, total)
VALUES (
UUID_TO_BIN(UUID()),
UUID_TO_BIN('6ccd780c-baba-1026-9564-5b8c656024db'),
'ORD-001',
99.99
);
-- Query with binary UUID (convert for readability)
SELECT
BIN_TO_UUID(id) as id,
BIN_TO_UUID(user_id) as user_id,
order_number,
total
FROM orders
WHERE user_id = UUID_TO_BIN('6ccd780c-baba-1026-9564-5b8c656024db');
Performance Optimization
Time-ordered UUIDs for better index performance:
sql
-- Use swap_flag=1 to reorder time bits for better clustering
CREATE TABLE events (
id BINARY(16) PRIMARY KEY DEFAULT (UUID_TO_BIN(UUID(), 1)),
event_type VARCHAR(50),
data JSON,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- This creates more sequential UUIDs for better InnoDB performance
INSERT INTO events (event_type, data)
VALUES ('user_login', '{"user_id": 123, "ip": "192.168.1.1"}');
-- Query with proper UUID conversion
SELECT
BIN_TO_UUID(id, 1) as id,
event_type,
data,
created_at
FROM events
ORDER BY id;
UUID indexing strategies:
sql
-- Composite indexes with UUID
CREATE TABLE user_sessions (
id BINARY(16) PRIMARY KEY DEFAULT (UUID_TO_BIN(UUID(), 1)),
user_id BINARY(16) NOT NULL,
session_token VARCHAR(255),
expires_at TIMESTAMP,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
INDEX idx_user_sessions (user_id, expires_at),
INDEX idx_session_token (session_token)
);
-- Partitioning with UUID (use hash partitioning)
CREATE TABLE large_dataset (
id BINARY(16) PRIMARY KEY DEFAULT (UUID_TO_BIN(UUID())),
data TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
PARTITION BY HASH(id) PARTITIONS 4;
Advanced MySQL UUID Usage
UUID validation and utilities:
sql
-- Create UUID validation function
DELIMITER //
CREATE FUNCTION IS_VALID_UUID(uuid_string VARCHAR(36))
RETURNS BOOLEAN
READS SQL DATA
DETERMINISTIC
BEGIN
DECLARE result BOOLEAN DEFAULT FALSE;
IF uuid_string REGEXP '^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$' THEN
SET result = TRUE;
END IF;
RETURN result;
END//
DELIMITER ;
-- Test UUID validation
SELECT IS_VALID_UUID('6ccd780c-baba-1026-9564-5b8c656024db') as valid;
SELECT IS_VALID_UUID('invalid-uuid') as invalid;
UUID version extraction:
sql
-- Extract UUID version
DELIMITER //
CREATE FUNCTION UUID_VERSION(uuid_string VARCHAR(36))
RETURNS INT
READS SQL DATA
DETERMINISTIC
BEGIN
RETURN CONV(SUBSTR(uuid_string, 15, 1), 16, 10);
END//
DELIMITER ;
-- Get UUID version
SELECT UUID_VERSION(UUID()) as version;
Bulk UUID operations:
sql
-- Generate multiple UUIDs efficiently
SELECT
UUID() as id,
CONCAT('User ', ROW_NUMBER() OVER()) as name,
CONCAT('user', ROW_NUMBER() OVER(), '@example.com') as email
FROM
(SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5) t1
CROSS JOIN
(SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5) t2
LIMIT 10;
-- Batch insert with UUIDs
INSERT INTO users (id, name, email)
SELECT
UUID(),
CONCAT('User ', n),
CONCAT('user', n, '@example.com')
FROM (
SELECT @row := @row + 1 as n
FROM (SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3) t1,
(SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3) t2,
(SELECT @row := 0) r
LIMIT 100
) numbers;
Migration and Compatibility
Converting existing tables to UUID:
sql
-- Add UUID column to existing table
ALTER TABLE existing_table
ADD COLUMN uuid_id BINARY(16) DEFAULT (UUID_TO_BIN(UUID(), 1));
-- Update existing rows with UUIDs
UPDATE existing_table SET uuid_id = UUID_TO_BIN(UUID(), 1) WHERE uuid_id IS NULL;
-- Make UUID column NOT NULL
ALTER TABLE existing_table MODIFY uuid_id BINARY(16) NOT NULL;
-- Add unique index
ALTER TABLE existing_table ADD UNIQUE INDEX idx_uuid (uuid_id);
MySQL version compatibility:
sql
-- MySQL 5.7 and earlier (no UUID_TO_BIN function)
CREATE TABLE legacy_uuids (
id CHAR(36) PRIMARY KEY DEFAULT (UUID()),
name VARCHAR(100)
);
-- MySQL 8.0+ (with UUID_TO_BIN optimization)
CREATE TABLE modern_uuids (
id BINARY(16) PRIMARY KEY DEFAULT (UUID_TO_BIN(UUID(), 1)),
name VARCHAR(100)
);
UUID Version Comparison
Choose the right version for your MySQL application:
- Version 1 - MySQL's default UUID(), time-based
- Version 3 - MD5 namespace-based (custom function needed)
- Version 4 - Random (custom function or app-generated)
- Version 5 - SHA-1 namespace-based (custom function needed)
- Version 6 - Time-ordered (custom implementation)
- Version 7 - Modern time-based (custom implementation)
For MySQL applications:
- Web applications: Use MySQL's built-in Version 1 with UUID_TO_BIN(UUID(), 1)
- High-performance systems: Consider Version 4 generated in application
- Distributed systems: Use Version 5 for deterministic cross-system IDs
How do I generate UUID in other databases?
SQL databases:
- PostgreSQL - Comprehensive UUID support with extensions
- SQL Server - NEWID() and NEWSEQUENTIALID()
- SQLite - Custom functions and extensions
- Oracle - SYS_GUID() function
NoSQL databases: