我已经创建了如下结构的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值。
5条答案
按热度按时间bmvo0sr51#
尝试
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 ;
cyvaqqii2#
根据食谱3.x:
您也可以使用char(36),而不是使用自动递增键作为主键。然后,每当使用table::save()方法保存新记录时,cakephp将使用一个唯一的36个字符的uuid(text::uuid)。
意味着每当使用table::save()方法保存新记录时,cakephp都会自动保存一个唯一的36个字符的uuid(text::uuid)。
只要改变
到
希望这会有帮助!
wsxa1bj13#
假设您想要为主键自动生成一个guid,这似乎只有在mysql中使用触发器才能实现。
更多信息请参见:https://www.electrictoolbox.com/mysql-guid-uuid-default-column/
gv8xihay4#
您正在尝试使varchar列自动递增。你不能那样做™.
众所周知,包含整数文本的varchar列很难正确排序。
在mysql中,自动填充(自动递增)id列必须具有整数数据类型。
尝试改变
至
(我选择unsigned bigint是因为它是可用的最大整数,而您在varchar(36)中选择36使它看起来像您期望表中有大量的行。但unsigned int将提供4千兆行,这可能就足够了。)
如果选择使用触发器或其他方法为varchar id列生成自动递增的值,则必须对事务进行大量的艰苦工作,以避免重复值的可能性。
如果您的客户机软件必须将此列视为varchar,则可以在视图或select中执行此操作。
SELECT CAST(id AS VARCHAR(36)) id
是的。2ekbmq325#
如果您确实希望与触发器一起生成uuid,那么您的表设计就有一些问题,例如
并且不能使用默认值,因为在尝试插入(2)时会出现重复错误;并且不能将notnull更改为null,因为主键必须有一个值。
您可以将id更改为null,并将主键更改为唯一键