数据库 32

mysql字段是自动增长类型结果却不是连续的数据库,mysql列属性约束

mysql字段是自动增长类型结果却不是连续的

今天建了一张表,设置其”id”属性为自动增加类型,但是在查看所有数据的时候,却发现”id”的值不是连续增加的。建表的语法如下:

mysql> create table person_list
    -> (
    ->     id        int        auto_increment    unique,
    ->    name    varchar(15)   not null,
    ->    sex     varchar(15)   default "中",
    ->    ID_C    varchar(20)   not null           unique,
    -> vocation   varchar(8),
    ->   salary   float         default 0.0
    -> )charset=utf8;
Query OK, 0 rows affected (0.09 sec)

mysql> desc person_list;
+----------+-------------+------+-----+---------+----------------+
| Field    | Type        | Null | Key | Default | Extra          |
+----------+-------------+------+-----+---------+----------------+
| id       | int(11)     | NO   | PRI | NULL    | auto_increment |
| name     | varchar(15) | NO   |     | NULL    |                |
| sex      | varchar(15) | YES  |     | 中      |                |
| ID_C     | varchar(20) | NO   | UNI | NULL    |                |
| vocation | varchar(8)  | YES  |     | NULL    |                |
| salary   | float       | YES  |     | 0       |                |
+----------+-------------+------+-----+---------+----------------+
6 rows in set (0.00 sec)

mysql>

之后我往这张表里面添加了一些数据,从中可以看出我所说的问题

mysql> select * from person_list;
+----+-----------+------+--------------------+--------------+---------+
| id | name      | sex  | ID_C               | vocation     | salary  |
+----+-----------+------+--------------------+--------------+---------+
|  1 | 诸葛亮    | 男   | 360428199908230544 | 蜀国         | 8654.56 |
|  2 | 关羽      | 男   | 360428198908230544 | 蜀国         |  86.236 |
|  3 | 貂蝉      | 女   | 361428198908231479 | 美女集团     | 4566.02 |
|  4 | 西施      | 女   | 795410365478901234 | 美女集团     |   124.1 |
|  5 | 雷军      | 男   | 469787036544025984 | 小米公司     |  1784.1 |
|  6 | 乔布斯    | 男   | 456982103749651024 | 苹果公司     | 88888.9 |
|  7 | 李白      | 中   | 147852036978410210 | NULL         |       0 |
| 10 | 乔布儿    | 男   | 456902103749651024 | 苹果公司     | 88888.9 |
| 13 | 乔布儿    | 男   | 056902103749651024 | 苹果公司     | 88888.9 |
+----+-----------+------+--------------------+--------------+---------+
9 rows in set (0.00 sec)

mysql> 

如果我现在再插入一条记录,那么这个新增加的记录的”id”值会是14

mysql> insert into person_list (name,sex,ID_C,vocation,salary) value ("马云","男","444989898784562304","淘宝公司",54588.85124);
Query OK, 1 row affected (0.05 sec)

mysql> select * from person_list;
+----+-----------+------+--------------------+--------------+---------+
| id | name      | sex  | ID_C               | vocation     | salary  |
+----+-----------+------+--------------------+--------------+---------+
|  1 | 诸葛亮    | 男   | 360428199908230544 | 蜀国         | 8654.56 |
|  2 | 关羽      | 男   | 360428198908230544 | 蜀国         |  86.236 |
|  3 | 貂蝉      | 女   | 361428198908231479 | 美女集团     | 4566.02 |
|  4 | 西施      | 女   | 795410365478901234 | 美女集团     |   124.1 |
|  5 | 雷军      | 男   | 469787036544025984 | 小米公司     |  1784.1 |
|  6 | 乔布斯    | 男   | 456982103749651024 | 苹果公司     | 88888.9 |
|  7 | 李白      | 中   | 147852036978410210 | NULL         |       0 |
| 10 | 乔布儿    | 男   | 456902103749651024 | 苹果公司     | 88888.9 |
| 13 | 乔布儿    | 男   | 056902103749651024 | 苹果公司     | 88888.9 |
| 14 | 马云      | 男   | 444989898784562304 | 淘宝公司     | 54588.9 |
+----+-----------+------+--------------------+--------------+---------+
10 rows in set (0.00 sec)

mysql> 

然后我故意输入10条错误的语句(这个表的ID_C值不能重复)

mysql> insert into person_list (name,sex,ID_C,vocation,salary) value ("马云","男","444989898784562304","淘宝公司",54588.85124);
ERROR 1062 (23000): Duplicate entry '444989898784562304' for key 'ID_C'
mysql> insert into person_list (name,sex,ID_C,vocation,salary) value ("马云","男","444989898784562304","淘宝公司",54588.85124);
ERROR 1062 (23000): Duplicate entry '444989898784562304' for key 'ID_C'
mysql> insert into person_list (name,sex,ID_C,vocation,salary) value ("马云","男","444989898784562304","淘宝公司",54588.85124);
ERROR 1062 (23000): Duplicate entry '444989898784562304' for key 'ID_C'
mysql> insert into person_list (name,sex,ID_C,vocation,salary) value ("马云","男","444989898784562304","淘宝公司",54588.85124);
ERROR 1062 (23000): Duplicate entry '444989898784562304' for key 'ID_C'
mysql> insert into person_list (name,sex,ID_C,vocation,salary) value ("马云","男","444989898784562304","淘宝公司",54588.85124);
ERROR 1062 (23000): Duplicate entry '444989898784562304' for key 'ID_C'
mysql> insert into person_list (name,sex,ID_C,vocation,salary) value ("马云","男","444989898784562304","淘宝公司",54588.85124);
ERROR 1062 (23000): Duplicate entry '444989898784562304' for key 'ID_C'
mysql> insert into person_list (name,sex,ID_C,vocation,salary) value ("马云","男","444989898784562304","淘宝公司",54588.85124);
ERROR 1062 (23000): Duplicate entry '444989898784562304' for key 'ID_C'
mysql> insert into person_list (name,sex,ID_C,vocation,salary) value ("马云","男","444989898784562304","淘宝公司",54588.85124);
ERROR 1062 (23000): Duplicate entry '444989898784562304' for key 'ID_C'
mysql> insert into person_list (name,sex,ID_C,vocation,salary) value ("马云","男","444989898784562304","淘宝公司",54588.85124);
ERROR 1062 (23000): Duplicate entry '444989898784562304' for key 'ID_C'
mysql> insert into person_list (name,sex,ID_C,vocation,salary) value ("马云","男","444989898784562304","淘宝公司",54588.85124);
ERROR 1062 (23000): Duplicate entry '444989898784562304' for key 'ID_C'

之后我又增加1条正确的记录,结果发现该新记录的”ID”值是25,最后一条 跟
倒数第二条 的”ID”值刚好是11-1=10

mysql> insert into person_list (name,sex,ID_C,vocation,salary) value ("马云的儿子","男","444989898784562305","淘宝公司",54588.85124);
Query OK, 1 row affected (0.04 sec)

mysql> select * from person_list;
+----+-----------------+------+--------------------+--------------+---------+
| id | name            | sex  | ID_C               | vocation     | salary  |
+----+-----------------+------+--------------------+--------------+---------+
|  1 | 诸葛亮          | 男   | 360428199908230544 | 蜀国         | 8654.56 |
|  2 | 关羽            | 男   | 360428198908230544 | 蜀国         |  86.236 |
|  3 | 貂蝉            | 女   | 361428198908231479 | 美女集团     | 4566.02 |
|  4 | 西施            | 女   | 795410365478901234 | 美女集团     |   124.1 |
|  5 | 雷军            | 男   | 469787036544025984 | 小米公司     |  1784.1 |
|  6 | 乔布斯          | 男   | 456982103749651024 | 苹果公司     | 88888.9 |
|  7 | 李白            | 中   | 147852036978410210 | NULL         |       0 |
| 10 | 乔布儿          | 男   | 456902103749651024 | 苹果公司     | 88888.9 |
| 13 | 乔布儿          | 男   | 056902103749651024 | 苹果公司     | 88888.9 |
| 14 | 马云            | 男   | 444989898784562304 | 淘宝公司     | 54588.9 |
| 25 | 马云的儿子      | 男   | 444989898784562305 | 淘宝公司     | 54588.9 |
+----+-----------------+------+--------------------+--------------+---------+
11 rows in set (0.00 sec)

mysql> 

所以我估摸着,在插入记录 语句错误的时候
自动增长类型的值会依旧增加,不是只有正确的时候才会+1。

今天建了一张表,设置其id属性为自动增加类型,但是在查看所有数据的时候,却发现id的不是连…

 

MySQL:列属性(列约束),mysql列属性约束

 1. 是否允许为空(Null/not Null)

    规定一个字段的值是否可以是null。默认是可以为空。

    数据库 1

    此时,插入值a = 10 , b 为空,发现可以正确插入:

    数据库 2

    若试图插入值b = 11,而a 不做处理,发现不能正确插入,提示 a
没有默认值。

    即当对某个字段未输入信息时,列属性趋向于先查找有无默认值。

   数据库 3

   tip: NULL与空字符串不同,Null会占用空间,需要表示某些字段可以为NULL。

  1. 设置默认值(default value)

     当插入数据中,有空字段时,会尝试查找该字段有没有设置默认值。

    若提前设置了默认值,则会使用默认值。如下图:

    数据库 4

   当只插入a = 11时,b 由于不允许为NULL,查找默认值,并设置b = 20.

    结果如下图:

    数据库 5

    只插入b = 11,也是同样的道理。

    tip: 若给某字段插入的值为NULL,则显示会是NULL,而不会选择默认值;

         当且仅当没有给该字段插入值,并且有默认值时,才会启用默认值。

       默认值常用的情况是:该字段不能为空,会设置默认值。

  1. 主键|唯一索引

   主键(PK : primary
key):在创建表时,可以唯一标识某条记录的字段或字段集合。

                                       
 可以是真实实体的属性,如身份证号,但常用解决方案是利用一个与实体信息不相关的属性,作为唯一标识

                                       
 主键不与业务逻辑发生关系,只用来标识记录。

ID 班级 姓名 年龄
1 1520113 张三 24
2 1520114 李四 26

    对于上表,姓名和年龄可能会出现重复,不能作为主键;

 
 若没有ID,而其他个字段单独都可能出现重复,可以考虑组合其中某几个字段(如班级+姓名),实现唯一标识。

   主键的设置方法:

  方案一:字段上设置

      数据库 6

   
 此时,若试图再次插入一个t_id为1的数据时,会提示错误,主键不能重复。

     另外,主键t_id也不可以设置为NULL,虽然并未设置NOT NULL。

     但是若类型允许,可以为负值,只要满足唯一标识原则。

     查询表,会发现t_id已被设为主键。

     数据库 7

   方案二:在建表的最后声明

1 create table teacher1(
2 t_id int,
3 t_name varchar(5),
4 class_name varchar(6),
5 days tinyint unsigned,
6 primary key (t_id)    //在定义的末尾注明主键是上述的哪个字段
7 );

   方案二的优势:可以标注多个字段作为组合主键。

   tip:
注意说法上的严谨:现在是一个主键上包含了两个字段,而不能说这两个字段都是主键,可以说这两个字段组成了主键。

   数据库 8

tip: 自动增长机制(为每条记录提供一个唯一的标识)

      每次插入记录时,将某个字段的值自动加一。

      使用auto_increment标识,如下图所示

   数据库 9

 
 对于设置了auto_increment的主键而言,当输入数据时,若把该字段的值设为NULL,或者不输入该字段内容。

   系统都会以自动增加的形式,为数据编号,如下图:

   数据库 10

   数据库 11

tip: 其实不是主键的字段,也可以设置为auto_increment。

另外,自动增长的初始值是可以设置的,默认是1.

通过alter 语句进行更改,如下图:

  数据库 12

此时再插入数据,不设置主键的值,会发现结果如下:

数据库 13

tip:当设置的N的值,小于当前主键的值时,则可以设置成功,但是实际仍然会基于现有的主键值进行自动增长。

question:
设置了auto_increment后,是否还可以手动插入主键的值?YES!!只要不发生冲突。

   数据库 14

能否更新当前的数据?YES,利用update语句。

   数据库 15

  1. 外键约束(foreign key)

    若一个实体的某个字段指向另一个实体的主键,eg.
student表的字段class_id指向class表的主键class_id。

    就成当前student实体的class_id是外键。

    被指向的实体,称为主实体,也叫父实体。class

    负责指向的实体,称为从实体,也叫子实体。student

作用:用于约束处于关系内的实体。

        ① 增加子表记录时,是否有与之对应的父表记录;

        ② 删除or更新父表记录时,子表应该如何处理相关的记录;

定义:在子表上增加外键字段,指向父表的主键。

       建立it_class表,设置字段class_id为主键:

   数据库 16

     
建立itcast_student表,定义字段class_id,并设置它为外键,指向it_class表中的主键字段class_id。

      语句为 foreign key (字段名) references 父表名 (父表主键);

   数据库 17

 
 若要在itcast_student表中,插入数据,但该学生所指的班级不存在,会导致创建不成功:

   数据库 18

   可以在父表it_class中插入数据,即使子表中没有指向其主键的数据:

   数据库 19

级联操作:当主表数据改变时,与之关联的从表数据应该如何处理。

① 主表更新:on update

② 主表删除:on delete

允许的级联动作:

① cascade:如果主表被更新or删除,则从表也会执行相应的操作。

② set
null:若主表记录被删除,则从表相应记录设置为null。表示从表不指向任何主表记录。

③ restrict:拒绝主表的相关操作。

 

修改外键:

   先删除,再新建,通过修改表来完成。

   alter table tb_name drop foreign key (class_id);

 
 删除外键需要通过指定外键名称来达到目的,可以通过在创建外键时,指定名称,也可以使用MySQL默认生成的名称。

  数据库 20

   新建外键,指定允许的级联动作为set null:

   数据库 21

 
 此时若删除父表it_class中编号为1的记录时,会发现与之关联的从表itcast_student中相应的记录处,变成了NULL:

   数据库 22

on update 指的是只有主表的主键发生变化,才会对从表发生影响。

数据库 23

 

1.
是否允许为空 (Null/not Null)
规定一个字段的值是否可以是null。默认是可以为空。 此时,插入…

如下图 将其UserID的标识列设置为”UserID”

   
 解决办法:

       
          在SQL Server
2005中建立User时没有将UserID标识列设置为”UserID”,默认的是空。

     错误原因:

数据库 24

数据库 25

方法/步骤

  1.  

    打开要设置的数据库表,点击要设置的字段,比如id,这时下方会出现id的列属性表

    数据库 26

  2.  

    列属性中,通过设置“标识规范”的属性可以设置字段自增,从下图上看,“是标识”的值是否,说明id还不是自增字段

    数据库 27

  3.  

    能够设置ID字段自增的字段必须是可自增的,比如int,bigint类型,而varchar类型是不可自增的。比如查看name的列属性时,可以看到“是标识”是否且不可更改。

    数据库 28

  4.  

    点击“标识规范”,展开后,点击“是标识”会出现下拉列表按钮,可以双击设置也可以从下拉列表选择。

    数据库 29

  5.  

    设置“是标识”的值是“是”之后,可以看到下面的属性会默认写上值

    数据库 30

  6.  

    可以设置标识增量和标识种子。标识增量是字段每次自动增加的值,比如1,则字段每次增加1;标识种子是字段的初始值,比如1,则第一条记录的该字段值是1

    数据库 31

  7. 数据库, 

    设置完成后,别忘记点击“保存”

    数据库 32

    END

注意事项

  • 设置自增字段时要注意字段的类型,不是所有字段类型都可以设置自增的。

  • 当设置了id自增时,即使插数据时传入id,或者不传id。插入数据的id也不会受外来id的影响,而是在数据库中的原有数据的id值上自增。(比如:数据库中的最后一条数据的id为8,当你插入数据时传递的id为5,插入后的数据id为9,同样假如当你插入数据的id为20,插入后的数据id依然为9。)

 

 

参考于:

将表中的ID设为自增

使用SQL Server 2014 数据库做web的项目出现错误提示: :不能将值 NULL
插入列 ‘id’,表 ‘likuiDb.dbo.User’;列不允许有空值。INSERT 失败。

sql server建表时怎么设置ID字段自增,以sql server2012为例介绍。