MySQL之完整性约束

Posted 进击的小白

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL之完整性约束相关的知识,希望对你有一定的参考价值。

一 介绍

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

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

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

UNSIGNED 无符号
ZEROFILL 使用0填充
技术分享图片
1 1. 是否允许为空,默认NULL,可设置NOT NULL,字段不允许为空,必须赋值
2 2. 字段是否有默认值,缺省的默认值是NULL,如果插入记录时不给字段赋值,此字段使用默认值
3 sex enum(male,female) not null default male
4 age int unsigned NOT NULL default 20 必须为正值(无符号) 不允许为空 默认是20
5 3. 是否是key
6 主键 primary key
7 外键 foreign key
8 索引 (index,unique...)
介绍

2、not null与default

 

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

技术分享图片
==================not null====================
mysql> create table t1(id int); #id字段默认可以插入空
mysql> desc t1;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
mysql> insert into t1 values(); #可以插入空


mysql> create table t2(id int not null); #设置字段id不为空
mysql> desc t2;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | NO   |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
mysql> insert into t2 values(); #不能插入空
ERROR 1364 (HY000): Field id doesnt have a default value



==================default====================
#设置id字段有默认值后,则无论id字段是null还是not null,都可以插入空,插入空默认填入default指定的默认值
mysql> create table t3(id int default 1);
mysql> alter table t3 modify id int not null default 1;



==================综合练习====================
mysql> create table student(
    -> name varchar(20) not null,
    -> age int(3) unsigned not null default 18,
    -> sex enum(male,female) default male,
    -> hobby set(play,study,read,music) default play,music
    -> );
mysql> desc student;
+-------+------------------------------------+------+-----+------------+-------+
| Field | Type                               | Null | Key | Default    | Extra |
+-------+------------------------------------+------+-----+------------+-------+
| name  | varchar(20)                        | NO   |     | NULL       |       |
| age   | int(3) unsigned                    | NO   |     | 18         |       |
| sex   | enum(male,female)              | YES  |     | male       |       |
| hobby | set(play,study,read,music) | YES  |     | play,music |       |
+-------+------------------------------------+------+-----+------------+-------+
mysql> insert into student(name) values(egon);
mysql> select * from student;
+------+-----+------+------------+
| name | age | sex  | hobby      |
+------+-----+------+------------+
| egon |  18 | male | play,music |
+------+-----+------+------------+

验证
View Code

3、unique

作用:限制字段的值唯一

#单列唯一
create table t1(id int nnique,name char(16));


#联合唯一
create table server(id int nuique,ip char(15),port int,unique(ip,port));

4、primary key

primary key 单从约束的角度去看,就等同于not null unique

强调;

1、一张表中必须有,并且只能有一个主键
2、一张表中都应该有一个id字段,而且应该把id字段做成主键

技术分享图片
 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 t19(
    ip char(15),
    port int,
    primary key(ip,port)
);
联合主键

5、auto_increment

束字段为自动增长,被约束的字段必须同时被key约束

create table t20(
    id int primary key auto_increment,
    name char(16)
)engine=innodb;


# auto_increment注意点:
1、通常与primary key连用,而且通常是给id字段加
2、auto_incremnt只能给被定义成key(unique key,primary key)的字段加

 





以上是关于MySQL之完整性约束的主要内容,如果未能解决你的问题,请参考以下文章

MySQL之完整性约束

百万年薪python之路 -- MySQL数据库之 完整性约束

mysql学习第5篇:数据库之完整性约束

mysql表操作之修改

MySQL 之约束数据库设计

day15(mysql之零碎知识)