SQL 用户 ID 自动递增

Posted

技术标签:

【中文标题】SQL 用户 ID 自动递增【英文标题】:SQL userID auto increment 【发布时间】:2013-06-25 12:23:36 【问题描述】:

mysql数据库就是这样的;

userID -> primaryKey, required, unsigned integer, auto increment, unique
usermail -> unique,varchar,required

我正在创建新用户。 userId 是自动递增的。如果之前插入了usermail,则会发生错误。我的问题是这个

Let's think that userID is between 1-9.(there are 9 users now). 
Somebody has inserted same usermail before and took error. 
After that,new user inserted another usermail but userID became 11 instead 10. 
Why? What should i do to make it 10?

【问题讨论】:

【参考方案1】:

您是否有必要从数据库属性本身增加用户 ID。因为我的意思是,在插入任何记录之前,只需从数据库中检索最后一个用户 ID,将其存储在一个整数变量中,然后将其递增并与新记录一起插入回数据库。

假设您的最后一个用户 ID 是 9。 使用这个查询 - Select max(userID) from "your table";

int x=0;
SqlDataReader dr=com.ExecuteReader();
if(dr.HasRows)

    While(dr.Read())
    
       x=Convert.ToInt32(dr.GetString(0).ToString);
    

x=x+1;

现在,既然您有了新的x 值,就可以轻松地将其插入到带有新记录的数据库中。 这样将遵循自动递增,即使发生故障插入也不会完成,UserID 不会增加。

【讨论】:

是的,这个解决方案正是我想要的。谢谢【参考方案2】:

当出现错误时,它似乎是在插入一个新行并增加唯一 ID。出错时,您需要查询表以获取最新 ID 并重置自动增量值

ALTER TABLE `table_name` AUTO_INCREMENT =new_number_here

在这里找到:http://forums.mysql.com/read.php?20,16088,17748#msg-17748

【讨论】:

是否可以在 my.ini 文件中添加参数?这是一个解决方案吗?【参考方案3】:

您必须将插入子句与下面的选择检查合并。

这是 mysql 的一种行为,它也会为错误和成功插入增加计数器

INSERT INTO [table name] SELECT '[value1]', '[value2]' FROM DUAL
WHERE NOT EXISTS(
SELECT [column1] FROM [same table name]
WHERE [column1]='[value1]'
AND [column2]='[value2]' LIMIT 1    )

在这里您可以看到如何使用此技术防止 insert 子句 insert-where-not-exists 插入数据时计数器会增加,并且重复数据将被忽略

【讨论】:

有没有办法像在my.ini文件中添加一个参数来解决这个问题? 不,没有办法通过查询或my.ini来阻止auto_incrementcounter,这里是mysql开发人员dev.mysql.com/doc/refman/5.5/en/…关于AUTO_INCREMENT Handling in InnoDB的详细信息

以上是关于SQL 用户 ID 自动递增的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 PostgreSQL 在 DBeaver 中创建自动递增/SERIAL id 列?

T-SQL表中Insert的自动递增Id

使用休眠注释自动递增和用户定义的 id

重置自动递增序列 pl-sql

SQL create语句自动递增附近的语法不正确

SQL 主键/标识键不是自动递增的