博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据库之完整性约束
阅读量:7206 次
发布时间:2019-06-29

本文共 6715 字,大约阅读时间需要 22 分钟。

一、介绍

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

作用:用于保证数据的完整性和一致性

主要分为:

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 必须为正值(无符号) 不允许为空 默认是203. 是否是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.255create table server(id int primary key auto_increment,name char(10),host char(15), #主机ipport 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 key20 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 key37 create table department3(38 id int,39 name varchar(20),40 comment varchar(100),41 constraint pk_name primary key(id); #创建主键并为其命名pk_name42 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 单列主键
单列主键
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 values21     -> ('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: 026 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

查看被关联表和关联表

 

转载地址:http://lvoum.baihongyu.com/

你可能感兴趣的文章
Java-JSON
查看>>
阿里云服务器磁盘挂载
查看>>
关于Python的一些基础操作
查看>>
70. Climbing Stairs
查看>>
C/C++语言中的结构体对齐
查看>>
css基础
查看>>
平衡树初阶——AVL平衡二叉查找树+三大平衡树(Treap + Splay + SBT)模板【超详解】...
查看>>
如果类型是dynamic的且其属性也是dynamic的
查看>>
liinux 下mysql常用命令
查看>>
如何用SQL语句查询Excel数据?
查看>>
用js实现分页功能以及利用xml实现分页功能——数据岛
查看>>
《Programming in Lua 3》读书笔记(十九)
查看>>
html知识点总结
查看>>
博客园
查看>>
Three.js加载3D模型
查看>>
Basic: Fisher's transform
查看>>
mint-ui vue双向绑定
查看>>
Eclipse快捷键一览表(转载)
查看>>
随机访问流 RandomAccessFile
查看>>
图片上传读取代码
查看>>