MySQL数据库学习【第五篇】完整性约束

一、介绍

约束条件与数据类型的宽度一样,都是可选参数

作用:用于保证数据的完整性和一致性
主要分为:

PRIMARY KEY (PK)    标识该字段为该表的主键,可以唯一的标识记录
FOREIGN KEY (FK)    标识该字段为该表的外键
NOT NULL    标识该字段不能为空
UNIQUE KEY (UK)    标识该字段的值是唯一的
AUTO_INCREMENT    标识该字段的值自动增长(整数类型,而且为主键)
DEFAULT    为该字段设置默认值

UNSIGNED 无符号
ZEROFILL 使用0填充

说明:

1. 是否允许为空,默认NULL,可设置NOT NULL,字段不允许为空,必须赋值
2. 字段是否有默认值,缺省的默认值是NULL,如果插入记录时不给字段赋值,此字段使用默认值
sex enum(‘male‘,‘female‘) not null default ‘male‘
age int unsigned NOT NULL default 20 必须为正值(无符号) 不允许为空 默认是20
3. 是否是key
主键 primary key
外键 foreign key
索引 (index,unique...)

二、not null 和default

是否可空,null表示空,非字符串
not null - 不可空
null - 可空

default默认值,创建列时可以指定默认值,当插入数据时如果未主动设置,则自动添加默认值
create table tb1(
id int not null defalut  2 ,
num int not null
)

三、unique约束(唯一性约束)

单列唯一

-----1.单列唯一---------
create table t2(
id int not null unique,
name char(10)
);
insert into t2 values(1,‘egon‘);
insert into t2 values(1,‘alex‘);
#上面创建表的时候把id设置了唯一约束。那么在插入id=1,就会出错了

多列唯一

-----2.多列唯一---------
#255.255.255.255
create table server(
id int primary key auto_increment,
name char(10),
host char(15), #主机ip
port int, #端口
constraint host_port unique(host,port) #constraint host_port这个只是用来设置唯一约束的名字的,也可以不设置默认就有了
);
insert into server(name,host,port) values(‘ftp‘,‘192.168.20.11‘,8080);
insert into server(name,host,port) values(‘https‘,‘192.168.20.11‘,8081); #ip和端口合起来唯一
select * from server;

四、primary key (主键约束)

primary key字段的值不为空且唯一

一个表中可以:

单列做主键
多列做主键(复合主键)

但一个表内只能有一个主键primary key

============单列做主键===============
#方法一:not null+unique
create table department1(
id int not null unique, #主键
name varchar(20) not null unique,
comment varchar(100)
);

mysql> desc department1;
+---------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(20) | NO | UNI | NULL | |
| comment | varchar(100) | YES | | NULL | |
+---------+--------------+------+-----+---------+-------+
rows in set (0.01 sec)

#方法二:在某一个字段后用primary key
create table department2(
id int primary key, #主键
name varchar(20),
comment varchar(100)
);

mysql> desc department2;
+---------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(20) | YES | | NULL | |
| comment | varchar(100) | YES | | NULL | |
+---------+--------------+------+-----+---------+-------+
rows in set (0.00 sec)

#方法三:在所有字段后单独定义primary key
create table department3(
id int,
name varchar(20),
comment varchar(100),
constraint pk_name primary key(id); #创建主键并为其命名pk_name

mysql> desc department3;
+---------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(20) | YES | | NULL | |
| comment | varchar(100) | YES | | NULL | |
+---------+--------------+------+-----+---------+-------+
rows in set (0.01 sec)

单列主键

 1 ============单列做主键===============
 2 #方法一:not null+unique
 3 create table department1(
 4 id int not null unique, #主键
 5 name varchar(20) not null unique,
 6 comment varchar(100)
 7 );
 8
 9 mysql> desc department1;
10 +---------+--------------+------+-----+---------+-------+
11 | Field   | Type         | Null | Key | Default | Extra |
12 +---------+--------------+------+-----+---------+-------+
13 | id      | int(11)      | NO   | PRI | NULL    |       |
14 | name    | varchar(20)  | NO   | UNI | NULL    |       |
15 | comment | varchar(100) | YES  |     | NULL    |       |
16 +---------+--------------+------+-----+---------+-------+
17 rows in set (0.01 sec)
18
19 #方法二:在某一个字段后用primary key
20 create table department2(
21 id int primary key, #主键
22 name varchar(20),
23 comment varchar(100)
24 );
25
26 mysql> desc department2;
27 +---------+--------------+------+-----+---------+-------+
28 | Field   | Type         | Null | Key | Default | Extra |
29 +---------+--------------+------+-----+---------+-------+
30 | id      | int(11)      | NO   | PRI | NULL    |       |
31 | name    | varchar(20)  | YES  |     | NULL    |       |
32 | comment | varchar(100) | YES  |     | NULL    |       |
33 +---------+--------------+------+-----+---------+-------+
34 rows in set (0.00 sec)
35
36 #方法三:在所有字段后单独定义primary key
37 create table department3(
38 id int,
39 name varchar(20),
40 comment varchar(100),
41 constraint pk_name primary key(id); #创建主键并为其命名pk_name
42
43 mysql> desc department3;
44 +---------+--------------+------+-----+---------+-------+
45 | Field   | Type         | Null | Key | Default | Extra |
46 +---------+--------------+------+-----+---------+-------+
47 | id      | int(11)      | NO   | PRI | NULL    |       |
48 | name    | varchar(20)  | YES  |     | NULL    |       |
49 | comment | varchar(100) | YES  |     | NULL    |       |
50 +---------+--------------+------+-----+---------+-------+
51 rows in set (0.01 sec)
52
53 单列主键

==================多列做主键================
create table service(
ip varchar(15),
port char(5),
service_name varchar(10) not null,
primary key(ip,port)
);

mysql> desc service;
+--------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+-------+
| ip | varchar(15) | NO | PRI | NULL | |
| port | char(5) | NO | PRI | NULL | |
| service_name | varchar(10) | NO | | NULL | |
+--------------+-------------+------+-----+---------+-------+
rows in set (0.00 sec)

mysql> insert into service values
-> (‘172.16.45.10‘,‘3306‘,‘mysqld‘),
-> (‘172.16.45.11‘,‘3306‘,‘mariadb‘)
-> ;
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0

mysql> insert into service values (‘172.16.45.10‘,‘3306‘,‘nginx‘);
ERROR 1062 (23000): Duplicate entry ‘172.16.45.10-3306‘ for key ‘PRIMARY‘

多列主键

 1 ==================多列做主键================
 2 create table service(
 3 ip varchar(15),
 4 port char(5),
 5 service_name varchar(10) not null,
 6 primary key(ip,port)
 7 );
 8
 9
10 mysql> desc service;
11 +--------------+-------------+------+-----+---------+-------+
12 | Field        | Type        | Null | Key | Default | Extra |
13 +--------------+-------------+------+-----+---------+-------+
14 | ip           | varchar(15) | NO   | PRI | NULL    |       |
15 | port         | char(5)     | NO   | PRI | NULL    |       |
16 | service_name | varchar(10) | NO   |     | NULL    |       |
17 +--------------+-------------+------+-----+---------+-------+
18 rows in set (0.00 sec)
19
20 mysql> insert into service values
21     -> (‘172.16.45.10‘,‘3306‘,‘mysqld‘),
22     -> (‘172.16.45.11‘,‘3306‘,‘mariadb‘)
23     -> ;
24 Query OK, 2 rows affected (0.00 sec)
25 Records: 2  Duplicates: 0  Warnings: 0
26
27 mysql> insert into service values (‘172.16.45.10‘,‘3306‘,‘nginx‘);
28 ERROR 1062 (23000): Duplicate entry ‘172.16.45.10-3306‘ for key ‘PRIMARY‘

五、auto_increment (自增约束)

步长increment与起始偏移量offset:auto_increment_increment,auto_increment_offset

3.--------偏移量:auto_increment_offset---------
==============没有设置偏移量的时候
create table dep(
id int primary key auto_increment,
name char(10)
);
insert into dep(name) values(‘IT‘),(‘HR‘),(‘EFO‘);
select * from dep;

================设置自增的时候以10开头
create table dep1(
id int primary key auto_increment,
name char(10)
)auto_increment = 10;
insert into dep1(name) values(‘IT‘),(‘HR‘),(‘EFO‘);
select * from dep1;

===============auto_increment_increment:自增步长
create table dep3(
id int primary key auto_increment,
 name char(10)
);
会话:通过客户端连到服务端(一次链接称为一次会话)
set session auto_increment_increment = 2; #会话级,只对当前会话有效
set global auto_increment_increment=2; #全局,对所有的会话都有效
insert into dep3(name) values(‘IT‘),(‘HR‘),(‘SALE‘),(‘Boss‘);

-----------查看变量----------
show variables like ‘%auto_in%‘;#查看变量。只要包含auto_in就都查出来了

=========auto_increment_offset:偏移量+auto_increment_increment:步长===========
注意:如果auto_increment_offset的值大于auto_increment_increment的值,
则auto_increment_offset的值会被忽略

set session auto_increment_offset=2;
set session auto_increment_increment=3;
show variables like ‘%auto_in%‘;

create table dep4(
id int primary key auto_increment,
name char(10)
);
insert into dep4(name) values(‘IT‘),(‘HR‘),(‘SALE‘),(‘Boss‘);

六、foreign key (外键约束)

员工信息表有三个字段:工号  姓名  部门

公司有3个部门,但是有1个亿的员工,那意味着部门这个字段需要重复存储,部门名字越长,越浪费

解决方法:

我们完全可以定义一个部门表

然后让员工信息表关联该表,如何关联,即foreign key

如下图简单的表示了一下员工表与部门表的关系,即员工表的(dep_id)要关联部门表的id字段

多对一(一个表多条记录的某一字段关联另一张表的唯一一个字段):员工有部门,部门又有好多信息,所以
分开建了一张部门表,部门表的id 和员工表里面
的dep_id相关联。(dep_id要关联部门表的id字段
(注意:1.先建被关联的表,
        2.被关联的字段必须唯一
        3.先给被关联的表插入记录
 )


先建张部门表(被关联表)
create table dep(
id int not null unique,
#id int primary key auto_increment,
name varchar(50),
comment varchar(100)
);

再建张员工表(关联表)
create table emp_info(
id int primary key auto_increment,
name varchar(20),
dep_id int,
constraint FK_depid_id foreign key(dep_id) references dep(id) #references :关联
on delete cascade  #关联的表删了,被关联的表也删了
on update cascade  #关联的表修改了,被关联的表也修改了
);
#先给被关联的表初始化记录
insert into dep values
(1,‘欧德博爱技术有限事业部‘,‘说的好...‘),
(2,‘艾利克斯人力资源部‘,‘招不到人‘),
(3,‘销售部‘,‘卖不出东西‘);

insert into emp_info values
(1,‘egon‘,1),
(2,‘alex1‘,2),
(3,‘alex2‘,2),
(4,‘alex3‘,2),
(5,‘李坦克‘,3),
(6,‘刘飞机‘,3),
(7,‘张火箭‘,3),
(8,‘林子弹‘,3),
(9,‘加特林‘,3);

#修改
update dep set id =301 where id = 2;
select * from dep;
delect * from em_info;

如果部门解散了,员工也就走吧,就是部门表没了,
员工表也就没有了。

运行结果如下图:

查看创建的表

修改id=301

查看被关联表和关联表

原文地址:https://www.cnblogs.com/xiaohema/p/8454888.html

时间: 2024-10-10 01:42:39

MySQL数据库学习【第五篇】完整性约束的相关文章

MySQL数据库学习【第一篇】数据库安装

一.基础部分 1.数据库是什么 之前所学,数据要永久保存,比如用户注册的用户信息,都是保存于文件中,而文件只能存在于某一台机器上. 如果我们不考虑从文件中读取数据的效率问题,并且假设我们的程序所有的组件都运行在一台机器上,那么用文件存取数据,并没有问题 但需要考虑的问题是:程序的执行效率依赖于承载它的硬件,而一台机器机器的性能总归是有限的,受限于目前的硬件水平,垂直扩展是有极限的.于是我们只能通过水平扩展来增强我们系统的整体性能,这就需要我们将程序的各个组件分布于多台机器去执行. 需要注意的是,

MySQL数据库学习【第二篇】基本操作和存储引擎

一.知识储备 数据库服务器:一台计算机(对内存要求比较高) 数据库管理系统:如mysql,是一个软件 数据库:oldboy_stu,相当于文件夹 表:student,scholl,class_list,相当于一个具体的文件 记录:1 susan  158426544   22,相当于文件中的一行内容 二.初始SQL语言 SQL(Structured Query Language 即结构化查询语言)SQL语言主要用于存取数据.查询数据.更新数据和管理关系数据库系统,SQL语言由IBM开发.SQL语

MySQL数据库学习【第九篇】索引原理与慢查询优化

一.介绍 1.什么是索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,因此对查询语句的优化显然是重中之重.说起加速查询,就不得不提到索引了. 2.为什么要有索引呢? 索引在MySQL中也叫做"键",是存储引擎用于快速找到记录的一种数据结构.索引对于良好的性能非常关键,尤其是当表中的数据量越来越大时,索引对于性能的影响愈发重要.索引优化应该是对查询性能优化最有效的手段了.

MySQL数据库学习笔记(十)----JDBC事务处理、封装JDBC工具类

首先需要回顾一下上一篇文章中的内容:MySQL数据库学习笔记(九)----JDBC的PreparedStatement接口重构增删改查 一.JDBC事务处理: 我们已经知道,事务的概念即:所有的操作要么同时成功,要么同时失败.在MySQL中提供了Commit.Rollback命令进行事务的提交与回滚.实际上在JDBC中也存在事务处理,如果要想进行事务处理的话,则必须按照以下的步骤完成. JDBC中事务处理的步骤: 1.要取消掉JDBC的自动提交:void setAutoCommit(boolea

MySQL数据库学习笔记(十二)----开源工具DbUtils的使用(数据库的增删改查)

[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4085684.html 联系方式:[email protected] [正文] 这一周状态不太好,连续打了几天的点滴,所以博客中断了一个星期,现在继续. 我们在之前的几篇文章中学习了JDBC对数据库的增删改查.其实在实际开发中,一般都是使用第三方工具类,但是只有将之前的基础学习好了,在使用开源工具的

MYSQL数据库学习笔记1

MYSQL数据库学习笔记1 数据库概念 关系数据库 常见数据库软件 SQL SQL的概念 SQL语言分类 数据库操作 创建数据库 查看数据库的定义 删除数据库 修改数据库 创建表 数据类型 约束 修改表 表的增删查改 查询 数据库概念 数据库是一种对大量信息进行管理的一种方法. 数据库系统从结构上看,也是可以分为三层的: 物理层:数据实际如何存储 逻辑层:存储的是什么数据,以及数据间是什么关系 试图层:提供给用户的部分数据 关系数据库 目前关于数据库模型最主流的有两种, 一种叫做关系型数据库,这

MySQL数据库学习初步

我使用的环境是Win7,开始学习PHP和MySQL,并且买了本<Head First PHP & MySQL>,可以从Head First Labs官网获得HeadFirst系列书籍的相关信息和源代码. 1.下载XAMPP开发包 从XAMPP中文官网下载目前比较流行的PHP开发包,XAMPP是完全免费且易于安装的Apache发行版,其中包含MySQL.PHP和Perl.XAMPP适用于Windows.Mac OS X和Linux,XAMPP开放源码包的设置让安装和使用出奇容易.我下载的

MySQL数据库高级(五)——触发器

MySQL数据库高级(五)--触发器 一.触发器简介 1.触发器简介 触发器是和表关联的特殊的存储过程,可以在插入,删除或修改表中的数据时触发执行,比数据库本身标准的功能有更精细和更复杂的数据控制能力. 2.触发器的优点 A.安全性可以基于数据库的值使用户具有操作数据库的某种权利.可以基于时间限制用户的操作,例如不允许下班后和节假日修改数据库数据:可以基于数据库中的数据限制用户的操作,例如不允许股票的价格的升幅一次超过10%.B.审计可以跟踪用户对数据库的操作.???审计用户操作数据库的语句:把

MySQL数据库学习之路

MySQL学习之路 目录 MySQL学习之路[第一篇]:MySQL单双实例安装 MySQL学习之路[第二篇]:MySQL登陆关闭.密码修改破解 MySQL学习之路[第三篇]:MySQL增删改查.用户权授.系统函数.字段修改 MySQL学习之路[第四篇]:MySQL进程连接.交互.变量 MySQL学习之路[第五篇]:MySQL主健和索引 MySQL学习之路[第六篇]:MySQL存储引擎.事务.锁 MySQL学习之路[第七篇]:MySQL日志管理 MySQL学习之路[第八篇]:MySQL备份恢复 M

mysql数据库学习(一)--基础

一.简介 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品.MySQL 最流行的关系型数据库管理系统,在 WEB 应用方面MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一. MySQL是一种数据库管理系统. MySQL是一种关联数据库管理系统. MySQL软件是一种开放源码软件. MySQL数据库服务器具有快速.可靠和易于使用的特点. MySQL