数据库的完整性约束(ForeignKey ,Unique)
文字转自于 海燕.博客
一、介绍
约束条件与数据类型的宽度一样,都是可选参数
作用:用于保证数据的完整性和一致性
主要分为:

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

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 单列主键

五、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

查看被关联表和关联表

数据库的完整性约束(ForeignKey ,Unique)的更多相关文章
- sql server 2008 数据库的完整性约束
一.数据库完整性概述 1.数据库的完整性: ①数据库的完整性是指数据的正确性和相容性 ②数据库完整性是防止不合语义或不正确的数据进入数据库 ③完整性体现了是否真实地反映现实世界 例: 学 ...
- 百万年薪python之路 -- MySQL数据库之 完整性约束
MySQL完整性约束 一. 介绍 为了防止不符合规范的数据进入数据库,在用户对数据进行插入.修改.删除等操作时,DBMS自动按照一定的约束条件对数据进行监测,使不符合规范的数据不能进入数据库,以确保数 ...
- 必须会的SQL语句(八)数据库的完整性约束
实体完整性 1.建表时定义主键 Create table 表名 ( Sno int identity(1,1), Sname nvarchar(20), ...
- 数据库——MySQL——完整性约束
约束,就是用来保证数据完整性和一致性的. 常见的约束分为: PRIMARY KEY (PK) 标识该字段为该表的主键,可以唯一的标识记录 FOREIGN KEY (FK) 标识该字段为该表的外键 NO ...
- MySQL数据库 InnoDB引擎 事务及行锁总结
一.事务 1.事务的四大特性 (1)原子性:事务开始后所有的操作要么一起成功,要么一起失败,整个事务是一个不可分割的整体. (2)一致性:是物开始前到结束后,数据库的完整性约束没有被破坏. (3)隔离 ...
- MySQL数据库基础详解(非原创)
文章大纲 一.数据库简介二.Mysql数据库简介三.Mysql安装与服务启动(Windows版本)四.Mysql图形化工具五.Mysql存储引擎精讲六.Mysql数据类型介绍七.Mysql主要专业名称 ...
- python面试题七: mysql数据库
---------------------------------------------------------------------------------------------------- ...
- ORM中聚合函数、分组查询、Django开启事务、ORM中常用字段及参数、数据库查询优化
聚合函数 名称 作用 Max() 最大值 Min() 最小值 Sum() 求和 Count() 计数 Avg() 平均值 关键字: aggregate 聚合查询通常都是配合分组一起使用的 关于数据库的 ...
- 关系型数据库ACID
关系型数据库ACID 一.事务 定义:所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位. 准备工作:为了说明事务的ACID原理,我们使用银行账户及资金管理的案例 ...
随机推荐
- 【Spring】Spring boot多数据源历险记
一.问题描述 笔者根据需求在开发过程中,需要在原项目的基础上(单数据源),新增一个数据源C,根据C数据源来实现业务.至于为什么不新建一个项目,大概是因为这只是个小功能,访问量不大,不需要单独申请个服务 ...
- php 使用PHPExcel 导出数据为Excel
<?php require_once 'PHPExcel/Classes/PHPExcel.php'; /** * 导出数据为Excel * @param array $fieldArr 标题数 ...
- samba配置(z)
http://www.cnblogs.com/mchina/archive/2012/12/18/2816717.html
- PAT 1082 射击比赛(20)(代码+思路)
1082 射击比赛(20 分) 本题目给出的射击比赛的规则非常简单,谁打的弹洞距离靶心最近,谁就是冠军:谁差得最远,谁就是菜鸟.本题给出一系列弹洞的平面坐标(x,y),请你编写程序找出冠军和菜鸟.我们 ...
- Ubuntu12.04添加环境变量
环境变量分为系统级和用户级. 系统级变量设置环境为/etc/environment和/etc/profile等,不要轻易修改,否则可能造成系统错误. 用户级变量设置路径为-/.bashrc和~/.pr ...
- Photoshop中比较实用的小技巧
Photoshop是目前最流行的图片处理软件软件之一.能够说,只要接触图片处理,就要和它打交道.Photoshop的强大功能和众多的优点不用多说.用photoshop做一些漂亮的图片,或对照片进行简单 ...
- 我对于UI设计这个领域的理解
User Interface(UI),包括三部分用户.界面以及用户与界面之间的交互关系.UI设计则是指对软件的人机交互.操作逻辑.界面美观的整体设计. 如何看待UI设计这个领域? 任何一个行业的出现都 ...
- [BAT] 执行xcopy命令后出现Invalid num of parameters错误的解决办法
如果是Windows下的命令行,对于有空格的文件路径要加引号,对于xcopy命令就是源路径和目标路径都要加引号 xcopy "C:\ppt" "D:\Program do ...
- 2018.09.19 atcoder AtCoDeer and Election Report(贪心)
传送门 很有意思的一道贪心. 就是每次翻最小的倍数来满足条件. 代码: #include<bits/stdc++.h> #define ll long long using namespa ...
- 2018.07.31洛谷P1552 [APIO2012]派遣(可并堆)
传送门 貌似是个可并堆的模板题,笔者懒得写左偏堆了,直接随机堆水过.实际上这题就是维护一个可合并的大根堆一直从叶子合并到根,如果堆中所有数的和超过了上限就一直弹直到所有数的和不超过上限为止,最后对于当 ...