您的位置:澳门新葡8455最新网站 > 数据库管理 > 操作数据表,自拉长字段值的连接依次增加完成

操作数据表,自拉长字段值的连接依次增加完成

发布时间:2019-12-01 12:31编辑:数据库管理浏览(99)

    背景


    在上后生可畏篇《数据库操作类SqlHelper》博文的末梢,提到了三个试行应用中遇见的标题,正是数据库表中的自拉长字段的赋值不受人为操纵。比如数据库有八个tb_Department表,DeptNO字段为自增进主键。

    1、概述

    数据表,或简单称谓为表,是数据库最重点的组成都部队分之黄金年代,是别的对象的根底,能够清楚为周围于Excel表格,有多行多列,示比方下:
      若是要存款和储蓄通信录新闻,对于数据库来讲,是用表来进展仓库储存,首先要基于实际供给显著关于通信录要存款和储蓄哪些数据。本例中要存款和储蓄“姓名”、“性别”及“联系格局”,这种约束每一列的积累内容的值称为字段,同有的时候间还要明确好该字段所属的数据类型。

    图片 1

      当存款和储蓄了全套消息后,会意识实际上每意气风发行正是一个客商完全的通信录信息,由此像那样的意气风发行就被誉为一条记下。

    图片 2


    图片 3

    2、成立数据表

    在登入到MySQL之后,首先查看现已存在的数据库有啥样,假若此番要在“test”数据库中积攒数据,则选拔接受该数据库,并用“SELECT”验证当前利用的实在为“test”数据库(该有的语句可参见初涉MySQL)。

    图片 4

    创立表的语法布局如下:

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

    图片 5

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

    基于语法成立该表,个中:

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

    目前安顿生龙活虎行数据

    3、查看数据表

    语法构造如下:

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

    亲自去做如下:

    图片 6

    添加“[FROM db_name]”未来,能够查看别的数据库下包涵的数据表,比方查看mysql数据库下的数据表:

    图片 7


    图片 8

    4、查看数据表布局

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

    SHOE COLUMNS FROM tbl_name

    DESC tbl_name

    SHOW CREATE TABLE tbl_name

    示范如下:

    图片 9

    SHOE COLUMNS FROM tbl_name

    图片 10

    DESC tbl_name

    图片 11

    SHOW CREATE TABLE tbl_name

      这种格局会将数据表创立时的源码、使用的囤积引擎及编码都来得出来,不过格式会相比乱,能够在终极加多“G”进行格式化管理,便于查看:

    图片 12

    SHOW CREATE TABLE tbl_nameG


    嗬!DeptNO字段怎么便是22了吧,不该是从4以前吧?

    5、记录的插入与追寻

    只要用Excel表格来比喻,那么以前唯有是形成了“列”的创导,现在要来填充“行”的开始和结果,也便是记录,语句如下:

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

    语法中字段名加上了中括号,意味着可以大致,假若省略字段称,将要为具有的字段都赋值,示比方下:

    图片 13

    例如在省略字段名的场地下,有的字段未有赋值,系统就能报错,提醒字段名与值不宽容:

    图片 14

    本来也能够对点名的字段名张开赋值,举例只对“客户名称”与“顾客收入”进行赋值:

    图片 15

    注意:

    1. 字段名与赋值的品类、个数、顺序始终能挨个对应;
    2. 赋值时毫无赶上字段所定义的长度;
    3. 比方急需插入空值,使用null;
    4. 插入日期或字符时,使用单引号(‘’)包围。

    若要验证记录是或不是已被写入数据表,可以使用“SELECT expr,… FROM tbl_name”,来查看,关于“SELECT”的事必躬亲语法,日后会介绍到,此处先轻便的运用一下:

    图片 16

    此处的 * 是指字段的过滤


    案由:那些表从前行行过非常多插入操作,数据库针对自增加字段的历次插入都会自行+1,后来剔除了生龙活虎部分行数据,然后再一次插入的时候,数据库不会依赖表中缺点和失误的字段值实行赋值,而是在原本的幼功上三番五次+1赋值。

    6、空值与非空

    当客商在网址登记账户时,也许会蒙受有的必填的选项,那么对于数据表而已,相似可以安装某个字段可认为空或取缔为空,举例:

    图片 17

    在那之中“NULL”表示该字段值允许为空

    创办的数据表“tb2”,用于空值与非空的测量试验,此中“NULL”,代表该字段值允许为空;“NOT NULL”,则象征该字段值幸免为空:

    图片 18

    查阅数据表的主导组织,可以看到对于字段值是还是不是同意为空,顾客名是不准,而顾客年龄允许为空。

    图片 19

    从今以后分头输入两条字段相互为空的记录:

    图片 20

    第一条记下中对此客商年龄设为空值,成功计入了数据表,可是第二条客户名设为空,系统提醒错误,显示“客户名”字段不许为空。查看表中数量开掘,唯有首先条记下被写入:

    图片 21


    结果:在新插入的“哈哈系”数据行在此之前,其实数据库已经向表里插入过二十次了,只是DeptNO字段值大于3的行数据被删去了,现在要新插入行数据来讲,就能够在21的幼功上+1,也即是第壹个表中现身的22了。

    7、自动编号

    在多少存款和储蓄的长河中,不常必要确认保证某条记下的唯大器晚成性,那时候可以为该字段加多“AUTO_INCREMENT”性情,即自动编号,私下认可情状下,初步值为1,每趟的增量为1,即1、2、3、……,且必得与主键结缘使用;自动编号的数据类型一定是数值型,假若应用小数类型,则必需保障小数点后的位数为0。

    主键节制即“P路虎极光IMARubiconY KEY”,能够保证数据的唯风姿洒脱性,每张数据表只好存在八个主键,且活动安装为“NOT NULL”。

    开创数据表“tb3”,用于机动编号的测量检验:

    图片 22

    未来查看“tb3”的基本结构:

    图片 23

      可以看到“id”字段的主键自动设为“NOT NULL”,且自动编号,意味着将来只必要向数据表中输入“客商名”就能够:

    图片 24

    鉴于只输入顾客姓名,由此必需标记字段“(username卡塔尔(قطر‎”,在输入了4条记下后,查看该数据表,注解“id”字段的确自动赋值为1、2、3、4。

    注意:
    电动编号必需与主键一齐使用,但主键实际不是必得与机关编号一起使用,就算双方都足以保障数据的唯后生可畏性。

    成立数据表“tb4”,用于测量检验主键赋值的唯豆蔻年华性:

    图片 25

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

    那个时候向表中写入记录,注意未有活动赋值,全部字段都要求写入数据:

    图片 26

      可知当“id”为6或第壹遍为32时,记录都被写入数据表,但第三回重复写入32时,系统提醒出错,由此保险了数额的唯黄金时代性。


    期望:

    8、唯风华正茂约束

    唯生机勃勃约束即“UNIQUE KEY”,相通能够保险记录的唯生龙活虎性,与主键节制分化的是:每张数据表可以存在多少个唯生机勃勃节制;唯意气风发限制的字段值可感觉空。

    此时恐怕会有疑难:既然数据表中允许存在多个唯风姿罗曼蒂克节制,唯大器晚成限制又同意为空,约等于数据表中留存多少个空值,岂不是相互冲突?
    要专心数据在蕴藏时,尽管有三个值,但提起底保留的空值唯有贰个,由此也合乎了唯风流洒脱性。

    始建数据表“tb5”,用于测量检验唯大器晚成限制的实际效果:

    图片 27

    再输入第叁回“汤姆”时,系统提醒错误,注脚其具有唯生龙活虎性:

    图片 28


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

    9、暗中认可约束

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

    图片 29

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

    里面前遇到于“性别”字段布置了“男子”、“女人”、“保密”三种可筛选,个中暗许是“保密”。

    图片 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.在插入新数据的时候,针对自增加字段能够人为操纵

    数据库中针对自拉长字段在插入时,无法钦赐显式值的。

    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
    

    执行看看能还是无法插入,哇哦,成功了,棒棒哒。

    图片 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  --打印输出参数
    
    •  缺点和失误值的核查:

    图片 32             图片 33

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

    • 缺省值的检查:

    图片 34            图片 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_Department表如下图所示,理论上缺点和失误的值为(4,5,7),现在往表里插入新值,看看结果什么。点击“扩大”开关,窗体下方系部编号自动现身第叁个缺点和失误值4,系部名称大家设置为“嘟嘟系”,提交增添成功后,系部编号会自动显示下贰个缺失值5。为了后边的缺省值的结果,大家再追加缺点和失误值(5,7)两行数据,使DeptNO字段三番五次依次增加。

     图片 36图片 37

    2.缺省值:

    当DeptNO字段三番五次依次增加时,如下图所示,点击“增减”开关,窗体下方的系部编号成功地领到到第三个缺省值9,系部名称输入“物理系”,提交扩大成功后,系部编号会活动显示下叁个缺省值10。

     图片 38图片 39

    调和结果突显大家提议的需求已经赢得消除。

    一.总结

    正文主要针对数据表中自增加字段的插入难点张开疏解,不管表中的数据增加和删除过多少次,程序连接能提供自拉长字段的缺点和失误值大概缺省值用于新数据行的插入,进而完成插入自增加字段值的总是依次增加天性。

     

    本文由澳门新葡8455最新网站发布于数据库管理,转载请注明出处:操作数据表,自拉长字段值的连接依次增加完成

    关键词:

上一篇:面向程序员的数据库访问性能优化法则

下一篇:没有了