MySQL 学习教程(四)【整理】-列属性(空属性、列描述和默认值/ 主键/ 自动增长/ 唯一键)

数据库 waitig 450℃ 百度已收录 0评论

注: 参考自 http://blog.csdn.net/qq_35246620/article/details/70823903

一、列属性之【 空属性、列描述和默认值】

列属性:实际上,真正约束字段的是数据类型,但是数据类型的约束比较单一,因此就需要额外的一些约束来保证数据的有效性,这就是列属性。

列属性有很多,例如:nullnot nulldefaultprimary keyunique keyauto_incrementcomment等。

1. 空属性

空属性有两个值,分别为:nullnot null.

虽然默认数据库的字段基本都为空,但是实际上在真正开发的时候,要尽可能的保证数据不为空,因为空数据没有意义,也没办法参与运算

执行如下 SQL 语句,进行演示:

-- 空属性演示
create table my_class(
    grade varchar(20) not null,
    room varchar(20) null  -- 显式声明为空,实际上,默认就为空
)charset utf8;

    6

    2. 列描述

    列描述:comment,表示描述,没有实际含义,是专门用来描述字段的,其会随着表创建语句自动保存,用来给程序员(数据库管理员)了解数据库使用。

    执行如下 SQL 语句,进行演示:

    -- 列描述演示
    create table my_friend(
        name varchar(20) not null comment '姓名',
        age tinyint not null comment '年龄'
    )charset utf8;

      8

      3. 默认值

      默认值:default某一数据会经常性出现某个具体的值,因此可以在开始的时候就指定好,而在需要真实数据的时候,用户可以选择性的使用默认值。

      执行如下 SQL 语句,进行演示:

      -- 默认值演示
      create table my_default(
          name varchar(20) not null,
          age tinyint unsigned default 0,
          gender enum('男','女') default '男'
      )charset utf8;

        9

        如上图所示,在列属性Default中已经展示了agegender字段的默认值,这说明咱们设置成功啦!接下来,咱们再演示如何使用默认值:

        -- 演示默认值的使用(即不该对应的字段赋值)
        insert into my_default (name) values ('Charies');
        insert into my_default values ('Guo',18,default);

          10

          观察上面的 SQL 语句及执行结果,相信大家已经知道如何使用默认值啦,即不给设置默认值的字段赋值或者用default代替相应的字段值。


          二、列属性之【主键】

          主键:primary key表中主要的键,每张表只能有一个字段(复合主键,可以多个字段)使用此属性,用来唯一的约束该字段里面的数据,不能重复

          1. 增加主键

          在 SQL 操作中,有 3 种方法可以给表增加主键,分别为:

          第 1 种:在创建表的时候,直接在字段之后,添加primary key关键字

          -- 增加主键
          create table my_pri1(
              name varchar(20) not null comment '姓名',
              number char(10) primary key comment '学号'
          )charset utf8;

            1

            如上图所示,此方法的优点是清晰明了,缺点则是只能使用一个字段作为主键。

            第 2 种:在创建表的时候,在所有的字段之后,使用primary key(主键字段列表)来创建主键(如果有多个字段作为主键,则称之为复合主键)

            -- 复合主键
            create table my_pri2(
                number char(10) not null comment '学号',
                course char(10) not null comment '课程编号',
                score tinyint unsigned default 60,
                -- 增加主键限制,学号和课程编号应该是对应的,具有唯一性
                primary key(number,course)
            )charset utf8;

              2

              第 3 种:当表创建完之后,额外追加主键,可以直接追加主键,也可以通过修改表字段的属性追加主键

              -- 追加主键
              create table my_pri3(
                  course char(10) not null comment '课程编号',
                  name varchar(10) not null comment '课程名称'
              )charset utf8;

                3

                在这里,追加主键有两种方式,分别为:

                • alter table my_pri3 modify course char(10) primary key comment '课程编号'; -- 不建议使用

                • alter table my_pri3 add primary key(course); -- 推荐使用

                4

                如上图所示,咱们追加主键成功。不过,想要用此方法,有一个前提,那就是:表中对应字段的数据是不重复的,即保证唯一性

                2. 主键约束

                主键约束,即主键对应的字符中的数据不允许重复,如果重复,则数据操作(主要是增和改)失败

                -- 主键约束(冲突)测试
                insert into my_pri3 values('MATH00123','泛函分析');
                insert into my_pri3 values('MATH00123','非线性分析');

                  5

                  3. 更新主键 & 删除主键

                  对于主键,没有办法直接更新,主键必须先删除,然后才能更新。

                  • 基本语法:alter table + 表名 + drop primary key;

                  执行如下 SQL 语句,进行测试:

                  -- 删除主键
                  alter table my_pri3 drop primary key;

                    6

                    如上图所示,咱们已经成功删除表my_pri3的主键啦!想要增加主键,只需要通过前面讲的 3 种方法即可。

                    4. 主键分类

                    根据主键的字段类型,咱们可以将主键分为两类,分别为:

                    • 业务主键,即使用真实的业务数据作为主键,例如学号、课程编号等等,很少使用;
                    • 逻辑主键,即使用逻辑性的字段作为主键,字段没有业务含含义,值是没有都没有关系,经常使用。

                    三、列属性之【自动增长】

                    自动增长:auto_increment当对应的字段,不给值,或者是默认值,或者是null的时候,就会自动的被系统触发,系统会从当前字段中取已有的最大值再进行+1操作,得到新的字段值

                    自增长通过跟主键进行搭配使用,其特点为:

                    • 任何字段要做自增长,前提其本身必须是一个索引,即key栏有值;
                    • 自增长字段必须是数字(整型);
                    • 每张表最多有一个自增长字段。

                    执行如下 SQL 语句,进行测试:

                    -- 自增长示例
                    create table my_auto(
                        id int primary key auto_increment,
                        name varchar(20) not null
                    )charset utf8;

                      1

                      1. 使用自增长

                      当自增长给定的值为null或者默认值的时候,就是触发自动增长。

                      -- 触发自增长
                      insert into my_auto (name) values('Charies');
                      insert into my_auto values(null,'Guo');
                      insert into my_auto values(default,'ChariesGuo');

                        2

                        如上图所示,自增长的第一个元素默认是1,自增长每次都是自增1。此外,如果自增长对应的字段输入了值,那么自增长失效,但是下一次还是能够正确的自增长,即从取该字段的最大值+1.

                        那么,如何确定下一次自增长的数值是什么呢?简单,咱们可以通过查看表的创建语句看到。

                        -- 查看表的创建语句
                        show create table my_auto;

                          3

                          如上图所示,显然在咱们之前插入的 3 条记录之后,下一次自增长是4,符合咱们的结论。

                          2. 修改自增长

                          自增长如果是涉及到字段改变,就必须先删除自增长,然后再增加自增长,因为每张表只能有一个自增长字段。

                          如果修改当前自增长字段已经存在的值,则只能修改比当前已有自增长字段中的最大值更大,不能更小,因为更小不生效。

                          • 基本语法:alter table + 表名 + auto_increment = 值;

                          执行如下 SQL 语句,进行测试:

                          -- 修改自增长测试
                          alter table my_auto auto_increment = 2;

                            4

                            如上图所示,当咱们修改自增长小于当前自增长字段中的最大值时,虽然显示 SQL 语句执行成功,但实际上并没有修改成功。下面,在执行如下 SQL 语句,进行测试:

                            -- 修改自增长测试
                            alter table my_auto auto_increment = 5;

                              5

                              如上图所示,显然当咱们修改自增长大于当前自增长字段中的最大值时,修改成功。

                              在这里,咱们不妨思考一下,为什么自增长是从1开始呢?为什么每次都自增1呢?虽然现在咱们不知道是什么原因导致上面的表示形式,但是咱们知道,所有系统的表现(如字符集、校对集)都是由系统内部的变量进行控制的,因此咱们可以查看自增长对应的变量:

                              • 基本语法:show variables like 'auto_increment%';
                              -- 查看自增长变量
                              show variables like 'auto_increment%';

                                6

                                如上图所示,其中auto_increment_increment表示步长auto_increment_offset表示初始值.

                                因此,咱们可以通过修改上面的两个变量实现不同的效果,但是需要注意的是:修改是会话级别,并且修改的是整个数据库,而不是单张表。

                                • 基本语法:set auto_increment_increment = 值;

                                执行如下 SQL 语句,进行测试:

                                -- 修改自增长步长
                                set auto_increment_increment = 5;
                                insert into my_auto values (null,'Guobinhit');

                                  7

                                  如上图所示,咱们已经修改成功!接下来,执行如下 SQL 语句,进行测试:

                                  -- 插入测试数据
                                  insert into my_auto values (null,'Guobinhit');
                                  insert into my_auto values (default,'Guobinhit');

                                    8

                                    如上图所示,咱们插入的第一个Guobinhitid值竟然是6,第二个Guobinhitid值倒是在6的基础上增加了511正常。这个现象产生的原因是:咱们之前的修改会导致系统产生一个误差,从初始值1开始计算加5,因此第一个Guobinhitid值是6.

                                    不过说实话,修改自增长并没有什么实际的意义,在此只是想让大家知道:自增长的初始值和步长都是可以修改的而已。

                                    3. 删除自增长

                                    自增长是字段的一个属性,因此可以通过modify来进行修改。想要删除自增长的话,只需要保证字段没有auto_increment即可

                                    • 基本语法:alter table + 表名 + modify + 字段 + 类型;

                                    执行如下 SQL 语句,进行测试:

                                    -- 删除自增长
                                    alter table my_auto modify id int primary key;

                                      9

                                      如上图所示,呃,好吧,出错啦!这是因为表my_auto之前已经定义了主键,所以在执行上述 SQL 语句的时候,系统会认为咱们想要定义多个主键,自然就要报错啦!解决方法就是,去掉上述 SQL 语句中的primary key即可。

                                      10

                                      如上图所示,显然咱们已经成功删除自增长啦!


                                      三、列属性之【唯一键】

                                      唯一键:每张表往往有多个字段需要具有唯一性,数据不能重复,但是在每张表中,只能有一个主键,因此唯一键就是用来解决表中多个字段需要具有唯一性的问题

                                      唯一键的本质与主键差不多,唯一键默认的允许字段为空,而且可以多个字段为空,因此空字段不参与唯一性的比较。

                                      1. 增加唯一键

                                      增加唯一键的方法和主键类似,有 3 种方法,分别为:

                                      第一种:在创建表的时候,字段后面直接添加unique或者unique key关键字

                                      -- 增加唯一键
                                      create table my_unique(
                                          number char(10) unique comment '学号',
                                          name varchar(20) not null
                                      )charset utf8;

                                        1

                                        第 2 种:在所有字段之后,增加unique key(字段列表),可以设置复合唯一键

                                        -- 测试唯一键
                                        create table my_unique2(
                                            number char(10) not null,
                                            name varchar(20) not null,
                                            unique key(number)  
                                        )charset utf8;

                                          2

                                          观察上图,咱们可能会发现一个问题,那就是:咱们设置的唯一键UNI,怎么变成了主键PRI啊?这是由于当唯一键满足非空条件的时候,其性质就和主键一样啦,因此在表中显示为PRI. 当然,在咱们执行如下 SQL 语句的时候,其就会表现出真正的性质:

                                          -- 查看表创建语句
                                          show create table my_unique2;

                                            3

                                            第 3 种:在创建表之后,增加唯一键

                                            -- 创建未设置唯一键的表
                                            create table my_unique3(
                                                id int primary key auto_increment,
                                                number char(10) not null,
                                                name varchar(20) not null
                                            )charset utf8;

                                              4

                                              如上图所示,表my_unique3未设置唯一键。接下来,执行如下 SQL 语句,进行测试:

                                              -- 增加唯一键
                                              alter table my_unique3 add unique key(number);

                                                5

                                                如上图所示,咱们已经成功向表中增加唯一键啦!

                                                2. 唯一键约束

                                                唯一键与主键本质相同,区别在于:唯一键允许字段值为空,并且允许多个空值存在

                                                -- 测试唯一键约束
                                                insert into my_unique values(null,'Charies');
                                                insert into my_unique values(null,'Guo');

                                                  6

                                                  3. 更新唯一键 & 删除唯一键

                                                  在表中,更新唯一键的时候,可以不用先删除唯一键,因为表的唯一键允许有多个。

                                                  删除唯一键的语法为:

                                                  • 基本语法:alter table + 表名 + drop index + 索引名字;

                                                  在这里,唯一键默认使用字段名作为索引名。

                                                  -- 删除唯一键
                                                  alter table my_unique3 drop index number;

                                                    7

                                                    如上图所示,显然咱们已经成功删除表中的唯一键啦!



                                                    本文由【waitig】发表在等英博客
                                                    本文固定链接:MySQL 学习教程(四)【整理】-列属性(空属性、列描述和默认值/ 主键/ 自动增长/ 唯一键)
                                                    欢迎关注本站官方公众号,每日都有干货分享!
                                                    等英博客官方公众号
                                                    点赞 (0)分享 (0)