带有varchar主键字段的mysql表

xghobddn  于 2021-06-20  发布在  Mysql
关注(0)|答案(5)|浏览(395)

我已经创建了如下结构的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值。

bmvo0sr5

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 ;

cyvaqqii

cyvaqqii2#

根据食谱3.x:
您也可以使用char(36),而不是使用自动递增键作为主键。然后,每当使用table::save()方法保存新记录时,cakephp将使用一个唯一的36个字符的uuid(text::uuid)。
意味着每当使用table::save()方法保存新记录时,cakephp都会自动保存一个唯一的36个字符的uuid(text::uuid)。
只要改变

id varchar(36) NOT NULL

id char(36) NOT NULL

希望这会有帮助!

wsxa1bj1

wsxa1bj13#

假设您想要为主键自动生成一个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/

gv8xihay

gv8xihay4#

您正在尝试使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中执行此操作。 SELECT CAST(id AS VARCHAR(36)) id 是的。

2ekbmq32

2ekbmq325#

如果您确实希望与触发器一起生成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)时会出现重复错误;并且不能将notnull更改为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)

相关问题