MySQL学习【第07篇】数据库之完整性约束(键)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_44558760/article/details/88790919

1、约束(constraint)

约束就是如果你填写了违反了某种法则的数据时(比如人的年龄不能超过200岁等等。)就会拒绝写入,而这种限定就叫做约束。对于关系型数据库来讲,约束通常有以下几种:

1)主键约束

主键约束就是当你把某个字段或者某些字段合并起来当做主键来用了,这就意味着你往里面填写数据的时候就不能出现重复了。主键还有一个要求,即主键不能为空值(NULL)。对于一张表来讲,主键只能有一个。

2)外键约束

假如在第一张表中有一个Name字段,而在第二张表中的第一个字段也有Name字段。那么很显然所有填入第一张表中的Name字段的数据都应该是参照了第二张表中的属性(换句话说,第一张表中的Name字段的填入规则必须和第二张表中的Name字段保持一致!)。这种参照(引用)方式叫做参照完整性约束,也叫做外键约束。

3)惟一键约束

惟一键约束和主键类似,只不过它的主键是可以为空的(NULL),并且对于一张表来讲,主键可以有多个。

4)检查式约束

  无论是主键还是惟一键都没有办法实现把某一个字段的取值限制在合理的范围内。比如,要求用户输入年龄,某个用户手一哆嗦,本来想写40,结果写成了400,那么它真的有400岁吗?很显然并不是。因此就有了检查式约束,即用户自定义有效取值范围的,它通常是一个布尔(bool)表达式,比较能符合条件就允许你往数据库填写数据,如果不能符合条件就禁止填入。

2、键

键就是选取出来某个具有特殊意义的字段。对于关系型数据库(简称RDBMS)来讲,键指的是字段,因为它是用来当做查找标准或者处理标准所使用的。

1)主键

主键就是能够惟一标识每一个记录的字段或字段的组合。主键是从候选键中挑选出来的一种方案。是需要被真正使用的。

打个比方,要求你在数据库存放中国排名前十的大学从建立到现在的学生信息,我们能用名字来做主键吗?显然是不能的,同理,我们也不能拿年龄当唯一键,更不能拿性别当唯一键啦。甚至学号也可能出现重复的情况(比如清华大学的学生和北大的学生的学号是一样的)。因此,我们可以将学校,姓名,年龄,性别以及学号组合起来当主键使用,这样出现重复的概念就极小啦。因此键未必是一个字段。

2)候选键

做DBA的童鞋应该知道在数据库的一张表当中,能够唯一标识每一个记录的字段的组合可能不止一个,我们还以上面的例子来说,统计全国排名前十的大学的学员信息,我们可以用学校,姓名,年龄,性别学号来做唯一主键,当然也可以只用学校,姓名和学号来做唯一主键。也就是说选择主键的方式有很多种。因此,所有这些能够用于唯一标识每一个记录的键就叫做候选键。也就是说这些候选键都是可以拿来当主键用的,候选键只是一种概念,并没有被真正使用。

3)外键

  如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外键。由此可见,外键表示了两个关系之间的相关联系。以另一个关系的外键作主关键字的表被称为主表,具有此外键的表被称为主表的从表。外键又称作外关键字。

打个比方,假如在第一张表中有一个Name字段,而在第二张表中的第一个字段也有Name字段。这个时候我们就可以说第一张表中的Name字段就是一个外键。也可以说第二张表中的Name字段是第一张表的一个外键。

3、约束条件

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...)

4、not null 和default  

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

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

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

1)单列唯一

-----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)多列唯一

-----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;

6、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)

2)多列主键

==================多列做主键================
 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'

 

猜你喜欢

转载自blog.csdn.net/weixin_44558760/article/details/88790919