oracel创建uuid为主键的表时可以直接指定default uuid();但是mysql不支持,可以通过触发器实现。下面是创建一个产品表的sql语句。
CREATE TABLE `product` (
`id` varchar(36) NOT NULL,
`productNum` varchar(50) NOT NULL,
`productName` varchar(50) DEFAULT NULL,
`cityName` varchar(50) DEFAULT NULL,
`DepartureTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`productPrice` double DEFAULT NULL,
`productDesc` varchar(500) DEFAULT NULL,
`productStatus` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `product` (`id`,`productNum`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TRIGGER `product_before_insert` BEFORE INSERT ON `product` FOR EACH ROW
BEGIN
IF new.id is NULL THEN
SET new.id = UUID();
END IF;
END;
除了使用sql语句直接创建触发器之外,还可以使用navicat可视化界面对已创建的表添加触发器,如下图所示:
触发器的语法格式一定要注意,下面是我踩过的坑,老报语法错误。 有问题的sql语句如下:
CREATE TABLE `product` (
`id` varchar(32),
`productNum` varchar(50) NOT NULL,
`productName` varchar(50) DEFAULT NULL,
`cityName` varchar(50) DEFAULT NULL,
`DepartureTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`productPrice` double DEFAULT NULL,
`productDesc` varchar(500) DEFAULT NULL,
`productStatus` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `product` (`id`,`productNum`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TRIGGER product_after_insert BEFORE INSERT ON product FOR EACH ROW
BEGIN
IF new.id IS NULL THEN
SET new.id = SELECT(UUID())
END IF
END
sql语句结尾没加分号 ;(end if 和end后面)
触发器名称和表名称没加 ``
设置id长度为32时,会报错 输入too long