mysql自动增长的主键问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql自动增长的主键问题相关的知识,希望对你有一定的参考价值。

用的mysql5.6.13,有一张表如下
CREATE TABLE `admins` (
`admin_id` INT(11) NOT NULL AUTO_INCREMENT COMMENT '管理员ID',
`admin_name` VARCHAR(50) NOT NULL DEFAULT '123456' COMMENT '管理员用户名',
`admin_password` VARCHAR(50) NOT NULL DEFAULT 'abcde?' COMMENT '管理员密码',
UNIQUE INDEX `admin_id` (`admin_id`)
)
COMMENT='管理员表'
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=2;

设置的admin_id是自动增长的,可是在插入数据时数据库不能自动生成,非要手动输入,否则报错没法保存。请问下大家是怎么回事?(在以前创建的表中,自动增长的字段还是可以用的,现在新建的表就不行)

报什么错?另外贴一下你的插入语句吧。

插入语句里面不要对该字段赋值。追问

插入语句:insert into admins values(,\'qwe\',\'qwe\')
报的错:

追答

语法错误,两个地方,字段数和值数不相符,括号后面不能有逗号,可以使用下面的方法:

方法1:
insert into admins(admin_name,admin_pass) values(\'qwe\',\'qwe\')

方法2:
insert into admins values(NULL,\'qwe\',\'qwe\')

参考技术A 看了你的插入语句是:insert into admins values(,'qwe','qwe')
而且你的截图中反映的是你的sql语句有语法错误。

你把它改成:insert into admins(admin_name,admin_password) values('qwe','qwe') 试试

如何使EF Core不插入MySql中自增长的主键(踩坑实录)

公司要求使用 .Net Core + EF Core + Mysql 开发项目,为了以后可以部署到Linux服务器上,实际是奇葩的客户需求。

数据库设计时虽然大部分表的主键都采用了UUID(也就是SQL Server的GUID),好处是啥我也就不(bu)说(hui)了(shuo),大家自行百度下吧。

而对于一些不是那么重要的表,或者说会经常产生大量数据的表,我们都是用自增长的主键,然后重点来了,在使用“Scaffold”命令生成实体类的时候,是下面这样的:

public partial class File
    {
        public int Id { get; set; }
        public string FileName { get; set; }
        public string FileType { get; set; }
        public string FileSize { get; set; }
        public string FilePath { get; set; }
        public string ProId { get; set; }
        public string CreateUser { get; set; }
        public string CreateUserName { get; set; }
        public DateTime CreateTime { get; set; }
        public int IsDel { get; set; }
    }

可以看到,该表的Id是Int型,也就是自增长的主键,而如果我们直接使用的话,那么在你不对主键赋值的情况下,第一次肯定是插入0,第二次就直接报错了,会提示你主键重复。

也就是Id并没有自增,EF Core直接给主键赋值为0,并执行插入。那么怎么才能告诉EF Core我这张表的Id是自增的呢?

经过百度,查到的答案是加特性,如下:

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]

或者

[DatabaseGenerated(DatabaseGeneratedOption.Computed)]

告诉EF Core它是自增的,你不要管我啦。然后你以为这样结束了?不好意思,一样报错,哈哈。正确答案是:

public partial class File
    {
        [DatabaseGenerated(DatabaseGeneratedOption.None)]
        public int Id { get; set; }
    }

没错应该使用“DatabaseGeneratedOption.None”的特性,官方注释是“The database does not generate values”。

虽然不知道为啥这个最不靠谱的却是正确的,但事实如此。加上这个特性后,插入时不用对Id做任何操作,直接会自增长,多少条都能保存成功

我也是把三个类型试了遍才发现的,写下来给大家提个醒,可以少走点弯路。

以上是关于mysql自动增长的主键问题的主要内容,如果未能解决你的问题,请参考以下文章

mysql主键生成策略 自动增长

mysql数据库中自动增长的主键也可以手动插入值吗

SQL如何插入自增长的主键值(如图)。谢谢

mysql数据库中自动增长的主键也可以手动插入值吗?如何插入

怎样用SQL语句将表的主键设为自动增长 每次加1?

mysql不是自动增长的主键怎么利用ibatis返回值判断是不是插入成功