简历模板免费网站,绵阳网站seo,好的门户网站,ui设计培训机构哪个比较好文章目录 表的约束1.空属性 --null not null2.默认值 -- default3.列描述4.zerofill5.主键6.自增长7.唯一键8.外键 表的约束
表的约束#xff1a;表中一定要有各种约束#xff0c;通过约束#xff0c;让我们未来插入数据库表中的数据是符合预期的。约束的本质是… 文章目录 表的约束1.空属性 --null not null2.默认值 -- default3.列描述4.zerofill5.主键6.自增长7.唯一键8.外键 表的约束
表的约束表中一定要有各种约束通过约束让我们未来插入数据库表中的数据是符合预期的。约束的本质是通过计数手段倒逼程序员插入正确的数据反过来站在mysql的视角凡是插入进来的数据都是符合约束的
约束的最终模板保证数据的完整性和可预期性
真正约束字段的是数据类型但是数据类型约束很单一需要有一些额外的约束更好的保证数据的合法性从业务逻辑角度保证数据的正确性。比如有一个字段是email要求是唯一的。
表的约束很多这里主要介绍如下几个 null/not null,default, comment, zerofill,primary keyauto_increment,unique key 。
1.空属性 --null not null
两个值null默认的和not null(不为空)
数据库默认字段基本都是字段为空但是实际开发时尽可能保证字段不为空因为数据为空没办法参与运算。 mysql select null;
------
| NULL |
------
| NULL |
------
1 row in set (0.00 sec)
mysql select 1null;
--------
| 1null |
--------
| NULL |
--------
1 row in set (0.00 sec)案例
创建一个班级表包含班级名和班级所在的教室。
站在正常的业务逻辑中
如果班级没有名字你不知道你在哪个班级
如果教室名字可以为空就不知道在哪上课
所以我们在设计数据库表的时候一定要在表中进行限制满足上面条件的数据就不能插入到表中。这就是“约束”。
ysql create table class(
- class_name varchar(20) not null,
- class_room varchar(10) not null);
Query OK, 0 rows affected (0.02 sec)
mysql desc class;
----------------------------------------------------
| Field | Type | Null | Key | Default | Extra |
----------------------------------------------------
| class_name | varchar(20) | NO | | NULL | |
| class_room | varchar(10) | NO | | NULL | |
----------------------------------------------------当我们插入数据时,没有给教室数据插入失败
mysql insert into class(class_name) values(高三1班);
ERROR 1364 (HY000): Field class_room doesnt have a default value只有我们将所有的列插入的时候如果插入的数据为NULL也不会插入成功只有插入合法的数据才能插入成功
2.默认值 – default
默认值某一种数据会经常性的出现某个具体的值可以在一开始就指定好在需要真实数据的时候用户可以选择性的使用默认值。
mysql create table t1 (
- name varchar(20) not null,
- age tinyint unsigned default 0,
- sex char(1) default 男
- );
Query OK, 0 rows affected (0.00 sec)
mysql desc t1;
-------------------------------------------------------
| Field | Type | Null | Key | Default | Extra |
-------------------------------------------------------
| name | varchar(20) | NO | | NULL | |
| age | tinyint(3) unsigned | YES | | 0 | |
| sex | char(1) | YES | | 男 | |
-------------------------------------------------------默认值的生效数据在插入的时候不给该字段赋值就使用默认值 注意只有设置了default的列才可以在插入值的时候对列进行省略
default:如果设置了用户将来插入有具体的数据就用用户的没有就用默认的
如果我们没有明确指定一列要插入那么用的是default如果建表中对应列默认没有设置default值那么则无法直接插入
default和not null不冲突而是相互补充的。not null是当用户想插入的时候null插入失败合法数据插入成功而default是当用户忽略这一列的时候使用默认值(如果设置了)如果没有设置那么就直接报错
mysql create table t1(- name varchar(20) not null,- age tinyint unsigned default 18,- gender char(1) not null default 男- );
Query OK, 0 rows affected (0.03 sec)mysql desc t1;
--------------------------------------------------------
| Field | Type | Null | Key | Default | Extra |
--------------------------------------------------------
| name | varchar(20) | NO | | NULL | |
| age | tinyint(3) unsigned | YES | | 18 | |
| gender | char(1) | NO | | 男 | |
--------------------------------------------------------
3 rows in set (0.00 sec)mysql insert into t1 (name,age,gender) values (null,20,男);
ERROR 1048 (23000): Column name cannot be null
mysql insert into t1 (age,gender) values (20,男);
ERROR 1364 (HY000): Field name doesnt have a default value
mysql insert into t1 (name,age,gender) values (张三,20,null);
ERROR 1048 (23000): Column gender cannot be null
mysql insert into t1 (name,age,gender) values (张三,20,男);
Query OK, 1 row affected (0.01 sec)mysql insert into t1 (name,age) values (张三,20);
Query OK, 1 row affected (0.00 sec)mysql select * from t1;
----------------------
| name | age | gender |
----------------------
| 张三 | 20 | 男 |
| 张三 | 20 | 男 |
----------------------注意not null和defalut一般不需要同时出现因为default本身有默认值不会为空
3.列描述
列描述comment没有实际含义专门用来描述字段会根据表创建语句保存用来给程序员或DBA来进行了解。
mysql create table t2(- name varchar(20) not null comment 姓名,- age tinyint unsigned default 0 comment 年龄,- gender char(2) default 男 comment 性别- );
Query OK, 0 rows affected (0.03 sec)通过desc查看不到注释信息
mysql desc t2;
-------------------------------------------------------
| Field | Type | Null | Key | Default | Extra |
-------------------------------------------------------
| name | varchar(20) | NO | | NULL | |
| age | tinyint(3) unsigned | YES | | 0 | |
| sex | char(2) | YES | | 男 | |
-------------------------------------------------------通过show可以看到
mysql show create table t2\G
*************************** 1. row ***************************Table: t2
Create Table: CREATE TABLE t2 (name varchar(20) NOT NULL COMMENT 姓名,age tinyint(3) unsigned DEFAULT 0 COMMENT 年龄,gender char(2) DEFAULT 男 COMMENT 性别
) ENGINEInnoDB DEFAULT CHARSETutf8
1 row in set (0.00 sec)4.zerofill
刚开始学习数据库时很多人对数字类型后面的长度很迷茫。通过show看看t3表的建表语句
mysql show create table t3\G
***************** 1. row *****************
Table: t3
Create Table: CREATE TABLE tt3 (a int(10) unsigned DEFAULT NULL,b int(10) unsigned DEFAULT NULL) ENGINEMyISAM DEFAULT CHARSETgbk
1 row in set (0.00 sec)可以看到int(10),这个代表什么意思呢整型不是4字节码这个10又代表什么呢其实没有zerofill这个属性括号内的数字是毫无意义的。a和b列就是前面插入的数据如下
mysql insert into t3 values(1,2);
Query OK, 1 row affected (0.00 sec)
mysql select * from t3;
------------
| a | b |
------------
| 1 | 2 |
------------但是对列添加了zerofill属性后显示的结果就有所不同了。修改t3表的属性
mysql alter table t3 change a a int(5) unsigned zerofill;
mysql show create table t3\G
*************************** 1. row ***************************
Table: t3
Create Table: CREATE TABLE t3 (a int(5) unsigned zerofill DEFAULT NULL, --具有了zerofillb int(10) unsigned DEFAULT NULL) ENGINEMyISAM DEFAULT CHARSETgbk
1 row in set (0.00 sec)对a列添加了zerofill属性再进行查找返回如下结果
mysql select * from t3;
-------------
| a | b |
-------------
| 00001 | 2 |
-------------这次可以看到a的值由原来的1变成00001这就是zerofill属性的作用如果宽度小于设定的宽度这里设置的是5自动填充0。要注意的是这只是最后显示的结果在MySQL中实际存储的还是1。为什么是这样呢我们可以用hex函数来证明。
mysql select a, hex(a) from t3;
---------------
| a | hex(a) |
---------------
| 00001 | 1 |
---------------可以看出数据库内部存储的还是1,00001只是设置了zerofill属性后的一种格式化输出而已。
5.主键
主键primary key用来唯一的约束该字段里面的数据不能重复不能为空一张表中最多只能有一个主键主键所在的列通常是整数类型。
创建表的时候直接在字段上指定主键
mysql create table t4 (
- id int unsigned primary key comment 学号不能为空,
- name varchar(20) not null);
Query OK, 0 rows affected (0.00 sec)mysql desc t4;
----------------------------------------------------
| Field | Type | Null | Key | Default | Extra |
----------------------------------------------------
| id | int(10) unsigned | NO | PRI | NULL | | key 中 pri表示该字段是主键
| name | varchar(20) | NO | | NULL | |
----------------------------------------------------主键约束主键对应的字段中不能重复一旦重复操作失败
mysql insert into t4 values(1, aaa);
Query OK, 1 row affected (0.00 sec)mysql insert into t4 values(1, aaa);
ERROR 1062 (23000): Duplicate entry 1 for key PRIMARY当表创建好以后但是没有主键的时候可以再次追加主键
alter table 表名 add primary key(字段列表)删除主键
alter table 表名 drop primary key;mysql alter table t4 drop primary key;
mysql desc t4;
----------------------------------------------------
| Field | Type | Null | Key | Default | Extra |
----------------------------------------------------
| id | int(10) unsigned | NO | | NULL | |
| name | varchar(20) | NO | | NULL | |
----------------------------------------------------复合主键
在创建表的时候在所有字段之后使用primary key(主键字段列表)来创建主键如果有多个字段作为主键可以使用复合主键
mysql create table t5(
- id int unsigned,
- course char(10) comment 课程代码,
- score tinyint unsigned default 60 comment 成绩,
- primary key(id, course) -- id和course为复合主键
- );
Query OK, 0 rows affected (0.01 sec)mysql desc t5;
--------------------------------------------------------
| Field | Type | Null | Key | Default | Extra |
--------------------------------------------------------
| id | int(10) unsigned | NO | PRI | 0 | | 这两列合成主键
| course | char(10) | NO | PRI | | |
| score | tinyint(3) unsigned | YES | | 60 | |
--------------------------------------------------------mysql insert into t5 (id,course)values(1, 123);
Query OK, 1 row affected (0.02 sec)mysql insert into t5 (id,course)values(1, 123);
ERROR 1062 (23000): Duplicate entry 1-123 for key PRIMARY -- 主键冲突6.自增长
auto_increment当对应的字段不给值会自动的被系统触发系统会从当前字段中已经有的最大值1操作得到一个新的不同的值。通常和主键搭配使用作为逻辑主键。
自增长的特点: 任何一个字段要做自增长前提是本身是一个索引key一栏有值 自增长字段必须是整数 一张表最多只能有一个自增长 mysql create table t6(
- id int unsigned primary key auto_increment,
- name varchar(10) not null default
- );mysql insert into t6(name) values(a);
mysql insert into t6(name) values(b);mysql select * from t6;
----------
| id | name |
----------
| 1 | a |
| 2 | b |
----------在插入后获取上次插入的 AUTO_INCREMENT 的值批量插入获取的是第一个值
mysql select last_insert_id();
------------------
| last_insert_id() |
------------------
| 1 |
------------------索引
在关系数据库中索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。索引的作用相当于图书的目录可以根据目录中的页码快速找到所需的内容。
索引提供指向存储在表的指定列中的数据值的指针然后根据您指定的排序顺序对这些指针排序。数据库使用索引以找到特定值然后顺指针找到包含该值的行。这样可以使对应于表的SQL语句执行得更快可快速访问数据库表中的特定信息。
7.唯一键
一张表中有往往有很多字段需要唯一性数据不能重复但是一张表中只能有一个主键唯一键就可以解决表中有多个字段需要唯一性约束的问题。
唯一键的本质和主键差不多唯一键允许为空而且可以多个为空空字段不做唯一性比较。
关于唯一键和主键的区别
我们可以简单理解成主键更多的是标识唯一性的。而唯一键更多的是保证在业务上不要和别的信息出现重复。乍一听好像没啥区别我们举一个例子 假设一个场景(当然具体可能并不是这样仅仅为了帮助大家理解) 比如在公司我们需要一个员工管理系统系统中有一个员工表员工表中有两列信息一个身份证号码一个是员工工号我们可以选择身份号码作为主键。 而我们设计员工工号的时候需要一种约束而所有的员工工号都不能重复。 具体指的是在公司的业务上不能重复我们设计表的时候需要这个约束那么就可以将员工工号设计成为唯一键。 一般而言我们建议将主键设计成为和当前业务无关的字段这样当业务调整的时候我们可以尽量不会对主键做过大的调整。 mysql create table student (
- id char(10) unique comment 学号不能重复但可以为空,
- name varchar(10)
- );
Query OK, 0 rows affected (0.01 sec)mysql insert into student(id, name) values(01, aaa);
Query OK, 1 row affected (0.00 sec)mysql insert into student(id, name) values(01, bbb); --唯一约束不能重复
ERROR 1062 (23000): Duplicate entry 01 for key idmysql insert into student(id, name) values(null, bbb); -- 但可以为空
Query OK, 1 row affected (0.00 sec)mysql select * from student;
------------
| id | name |
------------
| 01 | aaa |
| NULL | bbb |
------------8.外键
外键用于定义主表和从表之间的关系外键约束主要定义在从表上主表则必须是有主键约束或unique约束。当定义外键后要求外键列数据必须在主表的主键列存在或为null。
语法
foreign key (字段名) references 主表(列)案例 对上面的示意图进行设计
先创建主键表
create table myclass (id int primary key,name varchar(30) not null comment班级名
);再创建从表
create table stu (id int primary key,name varchar(30) not null comment 学生名,class_id int,foreign key (class_id) references myclass(id)
);正常插入数据
mysql insert into myclass values(10, C大牛班),(20, java大神班);
Query OK, 2 rows affected (0.03 sec)
Records: 2 Duplicates: 0 Warnings: 0mysql insert into stu values(100, 张三, 10),(101, 李四,20);
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0插入一个班级号为30的学生因为没有这个班级所以插入不成功
mysql insert into stu values(102, wangwu,30);
ERROR 1452 (23000): Cannot add or update a child row:
a foreign key constraint fails (mytest.stu, CONSTRAINT stu_ibfk_1
FOREIGN KEY (class_id) REFERENCES myclass (id))插入班级id为null比如来了一个学生目前还没有分配班级
mysql insert into stu values(102, wangwu, null);如何理解外键约束 首先我们承认这个世界是数据很多都是相关性的。 理论上上面的例子我们不创建外键约束就正常建立学生表以及班级表该有的字段我们都有。 此时在实际使用的时候可能会出现什么问题 有没有可能插入的学生信息中有具体的班级但是该班级却没有在班级表中 比如学校只有1-20个班但是在上课的学生里面竟然有21的学生(这个班目前并不存在)这很明显是有问题的。 因为此时两张表在业务上是有相关性的但是在业务上没有建立约束关系那么就可能出现问题。 解决方案就是通过外键完成的。建立外键的本质其实就是把相关性交给mysql去审核了提前告诉mysql表之间的约束关系那么当用户插入不符合业务逻辑的数据的时候mysql不允许你插入。