SQL数据库插入数据问题

UWPCoder 2017-11-22 01:34:50
目前有一份数据库有个列UserNum(学号)是从5000~7000。
软件已经实现了添加和删除功能。
目前有个需求:
当我添加了5001,5002,5003,5004,5005 5个学号,当5002被删除之后,新来的学生添加学号是默认从5006开始的,怎么从数据库中首先查询到空缺的最小的数字。如果没有就使用最大的号+1

代码如下:
start是初始学号比如5000开始,num是范围数量比如2000,这样就是5000~7000了
[/color]

string strSql = "";
//先查询库中 最大值
int startVal = start; //开始计算值
strSql = "select max(userNu) from t_user where userNu>"+start.ToString()+" and userNu<"+(num+start);
object obj = SqlHelper.ExecuteScalar(SqlHelper.ConnectionString, CommandType.Text, strSql);
if (obj != null && obj != DBNull.Value)
{
startVal = Convert.ToInt32(obj);
}
if (startVal > (num+start)) //判断是否到结尾 到结尾 再重新开始
{
startVal = 1;
}

for (int i = startVal; i < (start+num); i++)
{
string str = i.ToString();
while (str.Length < 4)
{
str = "0" + str;
}
strSql = "select id from t_user where userNu=@userNu";
obj = SqlHelper.ExecuteScalar(SqlHelper.ConnectionString, CommandType.Text, strSql,
new SqlParameter("userNu", str));
if (obj == null || obj == DBNull.Value)
{
txt_userNu.Text = str;
txt_userNu.Focus();
break;
}
}
...全文
326 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
帅猪儿 2017-11-30
  • 打赏
  • 举报
回复
写一个小函数也可以呀 Private string getminNum() { Datatable=sqldatatable("select id from table order by id ")//查询数据表中的全部id if(Datatable!=null&&Datatable.row.count>0 { for(int x=0;x<Datatable.row.count;x++) { if(x>Convert.toInt32(Datatable.row[x][0].tostring())//如果循环的数字小于列中的数字,则表示这个数字在表中没有,跳出循环,返回这个数字 return x.tostring(); } } }
闭包客 2017-11-30
  • 打赏
  • 举报
回复
删除的时候把这个号码记录下来,供下次使用。
xiao_lone 2017-11-29
  • 打赏
  • 举报
回复
select min(b.num) from(select TO_CHAR(rownum+5000) as num,a.* from (select distinct userNu from t_user ORDER BY userNu ) a where userNu > '5000' and userNu < '7000') b where b.num < b.userNu;
xiao_lone 2017-11-29
  • 打赏
  • 举报
回复
你用的是什么数据库啊,oracle可以用这种写法试试
UWPCoder 2017-11-22
  • 打赏
  • 举报
回复
题主插一楼,题目用到的是一个比喻,数据比较小。因为此软件系统已经正在被使用了,数据库的量也很大,前开发者现在已经联系不到。并且他使用的sql删除是真删除。数据库中没有is_delete的字段。所以想找一个不需要使用flag的方法找出一个范围内被删除的最小值
ManBOyyy 2017-11-22
  • 打赏
  • 举报
回复
无需那么麻烦,在通用表做一个字段,学号最大值,每次添加他的时候,调用这个通用表,在这个通用表加上1就可以了,无需那么麻烦的
Vito1993 2017-11-22
  • 打赏
  • 举报
回复
设置一个flag字段 如果删除flag为0 否则为1 更新数据时先查询flag为0的最小ID 存在更新 不存在插入新数据
秋的红果实 2017-11-22
  • 打赏
  • 举报
回复
改动下

List<int> listArray=new List<int>(){5000,5001,5003,5004}; //从数据库读取所有UserNum
int availableNum;
int num = 5000;
for (; num < listArray.Count; num++)
{
    if (listArray.IndexOf(num) <= -1)
    {
        break;
    }
    
}

availableNum = num;

秋的红果实 2017-11-22
  • 打赏
  • 举报
回复
看你数据量不大,可以这样 前提是:单用户系统。多用户的就麻烦了 程序读取所有UserNum,存入list(listArray),然后一个循环,找到可用的最小UserNum;若没有则用当前最大+1

List<int> listArray=new List<int>(){5000,5001,5003,5004};
int availableNum;
for (int num = 5000; num < listArray.Count; num++)
{
    if (listArray.IndexOf(num) <= -1)
    {
        availableNum = num;
        break;
    }

}

availableNum就是下面可以插入数据库的编号
  • 打赏
  • 举报
回复

--学号表
CREATE TABLE Student_Number
(
	Number INT NOT NULL
)
--学生信息表
CREATE TABLE Student
(
	Number INT NOT NULL,
	Name NVARCHAR(20) NOT NULL
)
--插入学号
DECLARE @Index INT=5001
WHILE(@Index<7000)
BEGIN
	INSERT INTO Student_Number VALUES(@Index)
	SET @Index=@Index+1
END
--插入学生信息
INSERT INTO Student VALUES(5001,'TEST1')
INSERT INTO Student VALUES(5003,'TEST2')

--找出未用的最小学号,号码都用完了变成了0
SELECT ISNULL(MIN(Number),0) Number FROM 
                    (SELECT Number FROM Student_Number 
                    EXCEPT
                    SELECT Number FROM Student) s
exception92 2017-11-22
  • 打赏
  • 举报
回复
当5002被删除之后,新来的学生添加学号是默认从5006开始的 -》数量一定的话就不要“真”删除了,不如在表中增加一个字段标识该条已经被删除,类似:Is_Delete (bit)类型, 删除设置为1,。 这样在添加的时候 先去按查询有没有Is_Delete为1的记录,有的话 就更新这条记录为新添加的数据,并把Is_Delete 设置为0 ,否则就查询max 再加1 添加。 如果查询出的有多条的话 还要考虑取 Top 1 的情况。
  • 打赏
  • 举报
回复
正确的做法是占位法 简单些说,就是先建一个表,表里是左右的座位(你的2000个学号) 每次插入学生的时候自动选择最小的未占用的学号作为学生学号,写入关联数据。 删除学生的时候更新关联数据为未关联。 这样做的好处是你每次插入操作只用做一次取出最小值,如果你对占位字段已经索引速度会很快。 至于相关的并发锁表等处理,你需要自己协调处理。

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧