android网站开发实例教程,购物网站模板带后台,郴州百度seo,天津西青区天气预报目录
1 空属性
2 默认值
3 列描述
4 zerofill
5 主键
6 自增长
7 唯一键
8 外键 真正约束字段的是数据类型#xff0c;但是数据类型约束很单一#xff0c;需要有一些额外的约束#xff0c;更好的保证数据的合法性#xff0c;从业务逻辑角度保证数据的正确性。比如有…
目录
1 空属性
2 默认值
3 列描述
4 zerofill
5 主键
6 自增长
7 唯一键
8 外键 真正约束字段的是数据类型但是数据类型约束很单一需要有一些额外的约束更好的保证数据的合法性从业务逻辑角度保证数据的正确性。比如有一个字段是email要求是唯一的。 表的约束很多这里主要介绍如下几个 null/not null,default, comment, zerofillprimary key auto_incrementunique key 。
1 空属性 1.两个值null默认的和not null(不为空) 2.数据库默认字段基本都是字段为空但是实际开发时尽可能保证字段不为空因为数据为空没办法参与运算。
mysql select null;
------
| NULL |
------
| NULL |
------
1 row in set (0.00 sec)mysql select 1null;
--------
| 1null |
--------
| NULL |
--------
1 row in set (0.00 sec)案例 创建一个班级表包含班级名和班级所在的教室。 站在正常的业务逻辑中 如果班级没有名字你不知道你在哪个班级 如果教室名字可以为空就不知道在哪上课 所以我们在设计数据库表的时候一定要在表中进行限制不满足上面条件的数据就不能插入到表中。这就是“约束”。
mysql create table myclass(- class_name varchar(20) not null,- class_room varchar(10) not null);
Query OK, 0 rows affected (0.02 sec)mysql desc myclass;
----------------------------------------------------
| Field | Type | Null | Key | Default | Extra |
----------------------------------------------------
| class_name | varchar(20) | NO | | NULL | |
| class_room | varchar(10) | NO | | NULL | |
----------------------------------------------------//插入数据时,没有给教室数据插入失败
mysql insert into myclass(class_name) values(class1);
ERROR 1364 (HY000): Field class_room doesnt have a default value
2 默认值 默认值某一种数据会经常性的出现某个具体的值可以在一开始就指定好在需要真实数据的时候用户可以选择性的使用默认值。
mysql create table tt10 (- name varchar(20) not null,- age tinyint unsigned default 0,- sex char(2) default 男- );
Query OK, 0 rows affected (0.00 sec)
mysql desc tt10;
-------------------------------------------------------
| Field | Type | Null | Key | Default | Extra |
-------------------------------------------------------
| name | varchar(20) | NO | | NULL | |
| age | tinyint(3) unsigned | YES | | 0 | |
| sex | char(2) | YES | | 男 | |
-------------------------------------------------------默认值的生效数据在插入的时候不给该字段赋值就使用默认值
mysql insert into tt10(name) values(zhangsan);
Query OK, 1 row affected (0.00 sec)
mysql select * from tt10;
----------------------
| name | age | sex |
----------------------
| zhangsan | 0 | 男 |
------------------------注意只有设置了default的列才可以在插入值的时候对列进行省略
如果在某一行只写了数据类型和名称后面什么都没跟那么默认会被设置成default null
例如name varchar(20)
3 列描述 列描述comment没有实际含义专门用来描述字段会根据表创建语句保存用来给程序员或DBA来进行了解。
mysql create table tt12 (- name varchar(20) not null comment 姓名,- age tinyint unsigned default 0 comment 年龄,- sex char(2) default 男 comment 性别- ); 注意not null和defalut一般不需要同时出现因为default本身有默认值不会为空不过语法允许这种方式
通过desc查看不到注释信息
mysql desc tt12;
-------------------------------------------------------
| 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 tt12\G
*************************** 1. row ***************************Table: tt12
Create Table: CREATE TABLE tt12 (
name varchar(20) NOT NULL COMMENT 姓名,
age tinyint(3) unsigned DEFAULT 0 COMMENT 年龄,
sex char(2) DEFAULT 男 COMMENT 性别
) ENGINEMyISAM DEFAULT CHARSETgbk
1 row in set (0.00 sec)
4 zerofill 刚开始学习数据库时很多人对数字类型后面的长度很迷茫。通过show看看tt3表的建表语句
mysql show create table tt3\G
***************** 1. row *****************Table: tt3
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 tt3 values(1,2);
Query OK, 1 row affected (0.00 sec)
mysql select * from tt3;
------------
| a | b |
------------
| 1 | 2 |
------------ 但是对列添加了zerofill属性后显示的结果就有所不同了。修改tt3表的属性
mysql alter table tt3 change a a int(5) unsigned zerofill;
mysql show create table tt3\G
*************************** 1. row ***************************
Table: tt3
Create Table: CREATE TABLE tt3 (
a int(5) unsigned zerofill DEFAULT NULL, --具有了zerofill
b int(10) unsigned DEFAULT NULL
) ENGINEMyISAM DEFAULT CHARSETgbk
1 row in set (0.00 sec) 对a列添加了zerofill属性再进行查找返回如下结果
mysql select * from tt3;
-------------
| a | b |
-------------
| 00001 | 2 |
------------- 这次可以看到a的值由原来的1变成00001这就是zerofill属性的作用如果宽度小于设定的宽度这里设置的是5自动填充0。要注意的是这只是最后显示的结果在MySQL中实际存储的还是1。为什么是这样呢我们可以用hex函数来证明。
mysql select a, hex(a) from tt3;
---------------
| a | hex(a) |
---------------
| 00001 | 1 |
--------------- 可以看出数据库内部存储的还是1,00001只是设置了zerofill属性后的一种格式化输出而已。
5 主键 主键primary key用来唯一的约束该字段里面的数据不能重复不能为空一张表中最多只能有一个主键主键所在的列通常是整数类型。 案例 创建表的时候直接在字段上指定主键
mysql create table tt13 (
- id int unsigned primary key comment 学号不能为空,
- name varchar(20) not null);
Query OK, 0 rows affected (0.00 sec)
mysql desc tt13;
----------------------------------------------------
| Field | Type | Null | Key | Default | Extra |
----------------------------------------------------
| id | int(10) unsigned | NO | PRI | NULL | | key 中 pri表示该字段是主键
| name | varchar(20) | NO | | NULL | |
---------------------------------------------------- 主键约束主键对应的字段中不能重复一旦重复操作失败。
mysql insert into tt13 values(1, aaa);
Query OK, 1 row affected (0.00 sec)
mysql insert into tt13 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 tt13 drop primary key;
mysql desc tt13;
----------------------------------------------------
| Field | Type | Null | Key | Default | Extra |
----------------------------------------------------
| id | int(10) unsigned | NO | | NULL | |
| name | varchar(20) | NO | | NULL | |
---------------------------------------------------- 复合主键 在创建表的时候在所有字段之后使用primary key(主键字段列表)来创建主键如果有多个字段作为主键可以使用复合主键。
mysql create table tt14(
- 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 tt14;
--------------------------------------------------------
| 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 tt14 (id,course)values(1, 123);
Query OK, 1 row affected (0.02 sec)mysql insert into tt14 (id,course)values(1, 123);
ERROR 1062 (23000): Duplicate entry 1-123 for key PRIMARY -- 主键冲突 实际上就是一种结合比如说主键A跟主键B组成联合主键 主键A跟主键B的数据可以完全相同联合就在于主键A跟主键B形成的联合主键是唯一的。 现在主键A数据是1主键B数据也是1联合主键就是是11这个11是唯一值绝对不充许再出现11这个唯一值。
6 自增长 auto_increment当对应的字段不给值会自动的被系统触发系统会从当前字段中已经有的最大值1操作得到一个新的不同的值。通常和主键搭配使用作为逻辑主键。 自增长的特点: 1.任何一个字段要做自增长前提是本身是一个索引key一栏有值 2.自增长字段必须是整数 3.一张表最多只能有一个自增长 案例
mysql create table tt21(
- id int unsigned primary key auto_increment,
- name varchar(10) not null default
- );
mysql insert into tt21(name) values(a);
mysql insert into tt21(name) values(b);
mysql select * from tt21;
----------
| id | name |
----------
| 1 | a |
| 2 | b |
----------
在插入后获取上次插入的 AUTO_INCREMENT 的值批量插入获取的是第一个值
mysql select last_insert_id();
------------------
| last_insert_id() |
------------------
| 2 |
------------------
然后我们再连续插入 如果我们手动插入某个数值如500那么这次插入后下次 再插入id自增长就会变成501. 我们每次插入mysql都会更新AUTO_INCREMENT中的数值 索引 在关系数据库中索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。索引的作用相当于图书的目录可以根据目录中的页码快速找到所需的内容。 索引提供指向存储在表的指定列中的数据值的指针然后根据您指定的排序顺序对这些指针排序。数据库使用索引以找到特定值然后顺指针找到包含该值的行。这样可以使对应于表的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: 0
mysql 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班2班但是在上课的学生里面竟然有计科3班的学生(这个班目前并不存在)这很明显是有问题的。 因为此时两张表在业务上是有相关性的但是在业务上没有建立约束关系那么就可能出现问题。 解决方案就是通过外键完成的。建立外键的本质其实就是把相关性交给mysql去审核了提前告诉mysql表之间的约束关系那么当用户插入不符合业务逻辑的数据的时候mysql不允许你插入。