带有varchar主键字段的mysql表

时间:2018-09-01 12:02:43

标签: mysql cakephp phpmyadmin

我已经创建了具有以下结构的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 个答案:

答案 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

希望这会有所帮助!