我已经创建了具有以下结构的users表
CREATE TABLE `users` (
`id` varchar(36) NOT NULL,
`first_name` varchar(100) NOT NULL,
`last_name` varchar(100) NULL,
`email` varchar(100) NOT NULL,
`password` varchar(100) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
我只想在插入新行时自动填充ID值。
答案 0 :(得分:1)
尝试id int(11) NOT NULL AUTO_INCREMENT,
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`first_name` varchar(100) NOT NULL,
`last_name` varchar(100) NULL,
`email` varchar(100) NOT NULL,
`password` varchar(100) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
答案 1 :(得分:1)
如果您确实希望与触发器一起生成uuid,那么您的表设计就存在一些问题
drop table if exists t;
CREATE TABLE t (
`id` varchar(36) not null,
`first_name` varchar(100) NOT NULL,
`last_name` varchar(100) NULL,
`email` varchar(100) NULL,
`password` varchar(100) NULL ,
PRIMARY KEY (`id`)
) ;
drop trigger if exists t;
delimiter $$
create trigger t before insert on t
for each row
begin
set new.id = (select uuid());
end $$
delimiter ;
truncate table t;
insert into t (first_name) values (1),(2);
ERROR 1364 (HY000): Field 'id' doesn't have a default value
并且您不能使用默认值,因为尝试插入(2)时会发生重复错误; 而且您不能将not null更改为null,因为主键必须具有一个值。
您可以将ID更改为null,并将主键更改为唯一键
drop table if exists t;
CREATE TABLE t (
`id` varchar(36) null,
`first_name` varchar(100) NOT NULL,
`last_name` varchar(100) NULL,
`email` varchar(100) NULL,
`password` varchar(100) NULL ,
unique key (`id`)
) ;
drop trigger if exists t;
create trigger t before insert on t
for each row
set new.id = (select uuid());
truncate table t;
insert into t (first_name) values (1),(2);
select * from t;
+--------------------------------------+------------+-----------+-------+----------+
| id | first_name | last_name | email | password |
+--------------------------------------+------------+-----------+-------+----------+
| 874bd297-adeb-11e8-b404-b8aeed249e19 | 1 | NULL | NULL | NULL |
| 874bda27-adeb-11e8-b404-b8aeed249e19 | 2 | NULL | NULL | NULL |
+--------------------------------------+------------+-----------+-------+----------+
2 rows in set (0.00 sec)
答案 2 :(得分:0)
您正在尝试使VARCHAR列自动递增。您不能那样做™。
众所周知,包含整数文本的VARCHAR列很难正确排序。
在MySQL中,自动填充(自动递增)的ID列必须具有整数数据类型。
尝试更改
`id` varchar(36) NOT NULL,
到
`id` UNSIGNED BIGINT NOT NULL AUTO_INCREMENT,
(我之所以选择UNSIGNED BIGINT,是因为它是可用的最大整数,并且您在VARCHAR(36)中选择36使其看起来像您期望该表中的行数很大。但是UNSIGNED INT将为您提供4个千兆位,这可能就足够了。)
如果您选择使用触发器或其他方式为VARCHAR ID列生成自动递增的值,则必须对事务进行很多艰苦的工作,以避免重复值的可能性。
如果客户端软件必须将此列视为VARCHAR,则可以在视图中进行选择。 SELECT CAST(id AS VARCHAR(36)) id
做到了。
答案 3 :(得分:0)
假设您要为主键自动生成GUID,这似乎只有在MySql中使用触发器才有可能。
CREATE TRIGGER before_insert_users
BEFORE INSERT ON users
FOR EACH ROW
BEGIN
IF new.id IS NULL THEN
SET new.id = uuid();
END IF;
END
更多信息可以在这里找到: https://www.electrictoolbox.com/mysql-guid-uuid-default-column/
答案 4 :(得分:0)
根据Cookbook 3.x:
您可以使用自动增量键作为主键,而不是 也使用char(36)。 CakePHP然后将使用唯一的36个字符的UUID (Text :: uuid)每当您使用Table :: save()保存新记录时 方法。
意味着每当您使用Table :: save()方法保存新记录时,CakePHP都会自动保存一个唯一的36个字符的 UUID(Text :: uuid)。
只需更改
id varchar(36) NOT NULL
至
id char(36) NOT NULL
希望这会有所帮助!