xml地图|网站地图|网站标签 [设为首页] [加入收藏]
当前位置: www8029com > 澳门新葡8522最新网站 > 正文

操作数据表,自增进字段值的接连递增实现

时间:2019-08-02 18:16来源:澳门新葡8522最新网站
一 . 背景 在上一篇《数据库操作类SqlHelper》博文的最后,提到了二个进行应用中相遇的标题,便是数据库表中的自增进字段的赋值不受人为调控。比方数据库有二个tb_Department表,De

背景


在上一篇《数据库操作类SqlHelper》博文的最后,提到了二个进行应用中相遇的标题,便是数据库表中的自增进字段的赋值不受人为调控。比方数据库有二个tb_Department表,DeptNO字段为自拉长主键。

1、概述

数据表,或简称为表,是数据库最根本的组成都部队分之一,是任何对象的基础,能够通晓为相近于Excel表格,有多行多列,示比如下:
  借使要存储通信录新闻,对于数据库来讲,是用表来进展仓储,首先要依据实际需求分明关于通信录要存款和储蓄哪些数据。本例中要存款和储蓄“姓名”、“性别”及“联系格局”,这种范围每一列的仓库储存内容的值称为字段,同一时间还要分明好该字段所属的数据类型。

澳门新葡8522最新网站 1

  当存款和储蓄了整套新闻后,会开掘实际每一行正是叁个用户完全的通信录信息,因此像这么的一行就被称呼一条记下。

澳门新葡8522最新网站 2


澳门新葡8522最新网站 3

2、创造数据表

在签到到MySQL之后,首先查看现已存在的数据库有何样,倘若此番要在“test”数据库中贮存数据,则选用使用该数据库,并用“SELECT”验证当前利用的着实为“test”数据库(该片段语句可参见初涉MySQL)。

澳门新葡8522最新网站 4

创设表的语法结构如下:

CREATE TABLE [IF NOT EXISTS] table_name(
column_name data_type,
column_name data_type,
……
)
其中“[IF NOT EXISTS]”在之前早就介绍过,而“column_name”指的是字段的称号,“data_type”则是数据类型;“,”是字段之间的分隔符,最终三个字段后无需加上“,”。

澳门新葡8522最新网站 5

动用这种输入格局能够使代码看起来更简洁明了

依赖语法创造该表,当中:

  • “username”即用户名称,数据类型为VARCHALacrosse,最多囤积21个字节;
  • “age”即用户年龄,数据类型为TINYINT,UNSIGNED指的是无符号,即非负;
  • “birthday”即用户出生日期,数据类型为DATE;
  • “salary”即用户收入,数据类型为FLOAT,最多存款和储蓄8位数,小数点后2位数;
  • “resume”即用户消息摘要,数据类型为TEXT。

于今安顿一行数据

3、查看数据表

语法结构如下:

SHOE TABLES [FROM db_name]
[LIKE 'pattern' | WHERE expr]

示范如下:

澳门新葡8522最新网站 6

添加“[FROM db_name]”然后,能够查看其余数据库下包含的数据表,举例查看mysql数据库下的数据表:

澳门新葡8522最新网站 7


澳门新葡8522最新网站 8

4、查看数据表结构

对此已开立成功的数据表,若想查看其组织是或不是与输入的相平等,可使用如下语句:

SHOE COLUMNS FROM tbl_name

DESC tbl_name

SHOW CREATE TABLE tbl_name

亲自过问如下:

澳门新葡8522最新网站 9

SHOE COLUMNS FROM tbl_name

澳门新葡8522最新网站 10

DESC tbl_name

澳门新葡8522最新网站 11

SHOW CREATE TABLE tbl_name

  这种格局会将数据表创立时的源码、使用的存款和储蓄引擎及编码都显示出来,可是格式会相比较乱,能够在结尾增加“G”举办格式化处理,便于查看:

澳门新葡8522最新网站 12

SHOW CREATE TABLE tbl_nameG


哎!DeptNO字段怎么正是22了吧,不该是从4从头吧?

5、记录的插入与追寻

万一用Excel表格来比喻,那么从前独有是瓜熟蒂落了“列”的创办,今后要来填充“行”的开始和结果,也正是记录,语句如下:

INSERT [INTO] tbl_name [(col_name,……)] VALUES(val,……)

语法中字段名加上了中括号,意味着能够省略,借使省略字段称,就要为富有的字段都赋值,示比方下:

澳门新葡8522最新网站 13

假诺在省略字段名的动静下,有的字段未有赋值,系统就能够报错,提醒字段名与值不相称:

澳门新葡8522最新网站 14

当然也得以对点名的字段名张开赋值,举个例子只对“用户名称”与“用户收入”实行赋值:

澳门新葡8522最新网站 15

注意:

  1. 字段名与赋值的品种、个数、顺序始终能挨个对应;
  2. 赋值时不用越过字段所定义的长度;
  3. 即使须求插入空值,使用null;
  4. 布署日期或字符时,使用单引号(‘’)包围。

若要验证记录是还是不是已被写入数据表,能够应用“SELECT expr,… FROM tbl_name”,来查看,关于“SELECT”的详细语法,日后会介绍到,此处先轻便的运用一下:

澳门新葡8522最新网站 16

此处的 * 是指字段的过滤


案由:那个表以前实行过众多插入操作,数据库针对自增加字段的历次插入都会自行 1,后来剔除了一部分行数据,然后再一次插入的时候,数据库不会依靠表中缺点和失误的字段值进行赋值,而是在本来的根基上三番五次 1赋值。

6、空值与非空

当用户在网址注册账户时,大概会遇上有些必填的选项,那么对于数据表而已,一样能够设置有些字段可认为空或禁止为空,举例:

澳门新葡8522最新网站 17

当中“NULL”表示该字段值允许为空

创办的数据表“tb2”,用于空值与非空的测验,个中“NULL”,代表该字段值允许为空;“NOT NULL”,则意味着该字段值禁止为空:

澳门新葡8522最新网站 18

翻开数据表的骨干组织,可知对于字段值是还是不是同意为空,用户名是不容许,而用户年龄允许为空。

澳门新葡8522最新网站 19

然后分头输入两条字段互相为空的笔录:

澳门新葡8522最新网站 20

先是条记下中对此用户年龄设为空值,成功计入了数据表,然而第二条用户名设为空,系统指示错误,呈现“用户名”字段不相同意为空。查看表中数量开掘,唯有首先条记下被写入:

澳门新葡8522最新网站 21


结果:在新插入的“哈哈系”数据行在此之前,其实数据库已经向表里插入过24回了,只是DeptNO字段值大于3的行数据被删去了,未来要新插入行数据的话,就能够在21的功底上 1,也正是首个表中出现的22了。

7、自动编号

在数码存款和储蓄的经过中,一时供给确认保证某条记下的独一性,此时可认为该字段加多“AUTO_INCREMENT”性情,即自动编号,私下认可情状下,伊始值为1,每趟的增量为1,即1、2、3、……,且务必与主键重组使用;自动编号的数据类型一定是数值型,倘使应用小数类型,则必须确认保障小数点后的位数为0。

主键约束即“PSportageIMAHeritage EVY KEY”,可以保障数据的独一性,每张数据表只好存在贰个主键,且自动安装为“NOT NULL”。

成立数据表“tb3”,用于机动编号的测量试验:

澳门新葡8522最新网站 22

今后查看“tb3”的中坚构造:

澳门新葡8522最新网站 23

  可知“id”字段的主键自动设为“NOT NULL”,且活动编号,意味着从此只必要向数据表中输入“用户名”就能够:

澳门新葡8522最新网站 24

由于只输入用户姓名,由此必须表明字段“(username)”,在输入了4条记下后,查看该数据表,阐明“id”字段的确自动赋值为1、2、3、4。

注意:
活动编号必须与主键一起使用,但主键并不是必须与机动编号一齐使用,即便双方都得以保险数据的独一性。

创建数据表“tb4”,用于测验主键赋值的独一性:

澳门新葡8522最新网站 25

主键写“PRIMARY KEY”或“KEY”都可以

那时候向表中写入记录,注意未有电动赋值,全部字段都供给写入数据:

澳门新葡8522最新网站 26

  可知当“id”为6或第二次为32时,记录都被写入数据表,但第贰次重复写入32时,系统提醒出错,由此保险了数据的独一性。


期望:

8、独一约束

独一约束即“UNIQUE KEY”,同样能够确认保证记录的独一性,与主键约束不一致的是:每张数据表能够存在七个独一约束;独一约束的字段值可认为空。

那时候大概会有疑点:既然数据表中允许存在多个独一约束,唯一约束又同意为空,约等于数据表中存在多少个空值,岂不是互相争论?
要注意数据在存款和储蓄时,即便有七个值,但最后保留的空值唯有贰个,由此也契合了独一性。

创设数据表“tb5”,用于测量检验独一约束的实效:

澳门新葡8522最新网站 27

再输入第二次“汤姆”时,系统提醒错误,注脚其持有独一性:

澳门新葡8522最新网站 28


  1. 在插入新数据的时候,针对自增加字段能够人为调节;
  2. 实则行使中,其实用户并不知道数据表中自拉长字段缺点和失误的是哪些值,程序须要活动提供缺点和失误依然缺省值。

9、暗中同意约束

默许约束即“DEFAULT”,当插入记录时,若无分明为字段赋值,系统则会自行赋予其暗中同意值。
  创制数据表“tb6”,用于演示私下认可值的实效:

澳门新葡8522最新网站 29

ENUM即枚举值,详细可参见[数据类型]()

里头对于“性别”字段安顿了“男人”、“女人”、“保密”三种可选用,在那之中暗许是“保密”。

澳门新葡8522最新网站 30

在输入记录时,只写入了用户名称为“汤姆”,由此性别为暗许自动抬高的“保密”。


设计

10、操作数据表的SQL语句汇总:

  • 开创数据表
    CREATE TABLE [IF NOT EXISTS] table_name(
    column_name data_type,
    column_name data_type,
    ……
    );

  • 查阅数据表
    SHOE TABLES [FROM db_name]
    [LIKE 'pattern' | WHERE expr]

  • 翻开数据表结构
    SHOE COLUMNS FROM tbl_name;

    DESC tbl_name;

    SHOW CREATE TABLE tbl_nameG;

  • 安顿记录
    INSERT [INTO] tbl_name [(col_name,……)] VALUES(val,……);

  • 查看记录
    SELECT expr,… FROM tbl_name;


版权声明:欢迎转载,欢迎扩散,但转载时请标明作者以及原文出处,谢谢合作!             ↓↓↓

1.在插入新数据的时候,针对自拉长字段能够人为垄断(monopoly)

数据库中针对自增长字段在插入时,不得以钦定显式值的。

insert into tb_Department(DeptNO,DeptName) values(4,N'嘿嘿系')

如此那般插入数据会报错的,提示您“当Identity_Insert设置为off时,无法为表’tb_Department’中的标记列插入显式值”。很刚毅,第三个期待的消除方案就是将Identity_Insert设置on,然后实施显式值插入,最终关闭标志列插入开关。

set identity_insert tb_Department on
insert into tb_Department(DeptNO,DeptName) values(4,N'嘿嘿系')
set identity_insert tb_Department off

试行看看能或不可能插入,哇哦,成功了,棒棒哒。

澳门新葡8522最新网站 31

2.其实选拔中,用户并不知道数据表中自增加字段未利用有如何值,程序需求活动提供缺点和失误照旧缺省值

自增进字段的值分为缺点和失误值和缺省值(那个术语是笔者自个儿定的,为了便利描述)

缺失值:比方数据表中自拉长字段的值为(1,2,3,5),则缺点和失误值为4。要想让程序自动物检疫索到缺点和失误值,需求对数据表举行周密扫描,逐行剖断自增进字段的值是不是三番五次递增,只要检索到不三番五次的值就将对应连串的值再次回到,并呈现在窗体上,不要求用户自身输入。

缺省值:举个例子数据表中自增进字段的值为(1,2,3,4),则缺省值为5。尽管原先有10行数据,然后将过量4的行删除后,自增进字段本人照旧三回九转递增的,只须要找到缺省值,重回给用户。

应用SQL脚本成立存款和储蓄进度完结:(注意:该兑现重返当前自增进字段中率先个缺点和失误值/缺省值,只适用于每趟插入一行数据的情况)

--创建一个存储过程用于自动提取自增长字段的第一个缺失值和缺省值
create procedure NumOfDeptNOForInsert
@temp int output  --定义一个输出参数,用于返回缺失值/缺省值
as
declare @Count int   --定义一个当前表中的行数
select @Count=COUNT(1) from tb_Department   --给变量@Count赋值
declare @I int, @IsOK bit = 0,@num int = 1  --定义一个用于循环的@I变量,一个用于判断是缺失值还是缺省值的变量@IsOK,一个记录缺省值的变量@num
set @I = 1;   --变量@I赋值为1
while(@I <= @Count)   --开始循环扫描行数据
begin
    select @temp=DeptNO from tb_Department where DeptNO=@I   --检索DeptNO值=@I值的行数据
    if(@temp != @I)  --判断@I值与DeptNO值是否比对不成功
    begin
        set @temp = @I  --将@I值赋值给@temp
        set @IsOK = 0   --标记为缺失值
        break    --退出循环     
    end
    else    --判断@I值与DeptNO值是否比对成功
    begin
        set @I = @I  1  --@I 1
        set @num = @I   --将@I赋值给@num
        set @IsOK = 1   --标记为缺省值
    end 
end   

if(@IsOK =0)   --判断是缺失值还是缺省值,如果是缺失值
begin
    select @temp  --直接返回@temp
end
else    --如果是缺省值
begin
    set @temp = @num  --将@num赋值给@temp
    select @temp      --再返回@temp
end

自增加字段的连日递增插入的仓储进度设计好后,首先在SQL Server初级中学结束学业生升学考试查一下。

declare @temp int --定义输出参数
exec dbo.NumOfDeptNOForInsert @temp  --调用储存过程
print @temp  --打印输出参数
  •  缺点和失误值的检察:

澳门新葡8522最新网站 32             澳门新葡8522最新网站 33

调用存款和储蓄进度看看缺点和失误的第三个值是还是不是5,结果跟预期一样。

  • 缺省值的核算:

澳门新葡8522最新网站 34            澳门新葡8522最新网站 35

调用存款和储蓄进度,找到的首先个缺省值为7,结果跟预期的一律。

 实践

近些日子的深入分析规划做好后,当然就是选用于试行了,主即使编写制定获取自拉长字段的缺点和失误值/缺省值的主意: 

        /// <summary>
        /// 获取自增长字段的第一个缺失值或者缺省值
        /// </summary>
        /// <returns>缺失值/缺省值</returns>
        private int GetDeptNO()
        {
            string cmdText = @"NumOfDeptNOForInsert";
            SqlParameter[] parameters =
            {
                new SqlParameter("@temp",SqlDbType.Int)
            };
            parameters[0].Direction = ParameterDirection.Output;
            int deptNO = (int)SqlHelper.ExecuteScalar(SqlHelper.ConnString, CommandType.StoredProcedure, cmdText,parameters);
            return deptNO;
        }

程序全部的UI设计和编码在博文《数据库操作类SqlHelper》中都早就陈诉,这里就不在再三讲了。相对于事先来讲,须要转移代码的地点为“扩展”开关的点击管理程序和InsertData()方法: 

        private void tsbInsert_Click(object sender, EventArgs e)
        {
            cmdType = CmdType.Insert;
            //将gbDept控件设置可用,textbox控件设为可用,并将Text属性清空
            this.gbDept.Enabled = true;
            this.txtDeptName.Enabled = true;
            this.txtDeptName.Text = string.Empty;
            //显示即将插入的DeptNO值
            this.lbDeptNO.Text = GetDeptNO().ToString();
        }

        /// <summary>
        /// 插入数据
        /// </summary>
        private void InsertData()
        {
            //判断系部名称是否为空
            if (string.IsNullOrEmpty(this.txtDeptName.Text.Trim()))
            {
                MessageBox.Show("系部名称不能为空!");
                return;
            }
            //定义插入数据的SQL脚本,其中set identity_insert tb_Department on/off主要是为了能让自增长主键连续有序地插入
            string cmdText = @"set identity_insert tb_Department on 
                               insert into tb_Department(DeptNO,DeptName) values(@DeptNO,@DeptName)
                               set identity_insert tb_Department off";
            ////定义插入数据的Sql脚本
            //string cmdText = @"insert into tb_Department(DeptName) values(@DeptName)";
            //SQL脚本参数设置
            SqlParameter[] parameters =
            {
                new SqlParameter("@DeptNO",(object)this.lbDeptNO.Text),
                new SqlParameter("@DeptName",(object)this.txtDeptName.Text.Trim())
            };
            //执行插入,并返回受影响的行数
            int rows = SqlHelper.ExecuteNonQuery(SqlHelper.ConnString, CommandType.Text, cmdText, parameters);
            //判断是否插入成功,并提示
            if (rows > 0)
            {
                //更新datagridview控件的数据
                LoadData();
                //显示即将插入的DeptNO值
                this.lbDeptNO.Text = GetDeptNO().ToString();
                //将系部名称设为空
                this.txtDeptName.Text = string.Empty;
                MessageBox.Show("插入成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            else
            {
                MessageBox.Show("插入失败!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
        }

        private void btnOK_Click(object sender, EventArgs e)
        {
            //执行增删改操作
            switch (cmdType)
            {
                case CmdType.Insert:
                    InsertData();
                    break;
                case CmdType.Delete:
                    DeleteData();
                    break;
                case CmdType.Update:
                    UpdateData();
                    break;
            }
        }

结果

UI和编码落成后,调节和测验程序是很关键的,能从调试的进度中再次出现整个功用的思绪,也能找到一些难点所在,修复bug,然后重编码。废话相当少说看结果吗:

1.缺失值:

借使一发端的tb_澳门新葡8522最新网站,Department表如下图所示,理论上缺点和失误的值为(4,5,7),以后往表里插入新值,看看结果怎么样。点击“增添”开关,窗体下方系部编号自动出现第几个缺点和失误值4,系部名称我们设置为“嘟嘟系”,提交加多成功后,系部编号会活动展现下叁个缺点和失误值5。为了前面包车型客车缺省值的结果,大家再扩大缺失值(5,7)两行数据,使DeptNO字段三翻五次递增。

 澳门新葡8522最新网站 36澳门新葡8522最新网站 37

2.缺省值:

当DeptNO字段三翻五次递增时,如下图所示,点击“增减”按键,窗体下方的系部编号成功地领到到第一个缺省值9,系部名称输入“物理系”,提交扩充成功后,系部编号会活动展现下三个缺省值10。

 澳门新葡8522最新网站 38澳门新葡8522最新网站 39

调解结果彰显大家提议的急需已经获得减轻。

一.总结

本文主要针对数据表中自增加字段的插入难题开始展览教学,不管表中的数据增删过些微次,程序连接能提供自增加字段的缺点和失误值可能缺省值用于新数据行的插入,进而完成插入自拉长字段值的连天递增性子。

 

编辑:澳门新葡8522最新网站 本文来源:操作数据表,自增进字段值的接连递增实现

关键词: www8029com