快捷搜索:  汽车  科技

mysql中的约束(MySQL中的6种约束你掌握了几种)

mysql中的约束(MySQL中的6种约束你掌握了几种)一个字段名只能在联合主键字段表中出现一次;主键值必须唯一标识表中的每一行,并且不能出现的情况,即表中不能存在有相同主键的两行或两行以上数据,严格遵守唯一性原则;在建立数据表的时候,一般情况下,为了方便更快地查找表中的记录,都会要求在表中设置一个“主键”。”主键“是表里面的一个特殊字段,这个字段能够唯一标识该表中的每条信息。主键分为“单字段主键”和“多字段联合主键”,并且在使用主键的时候需要注意以下几个点:一个表只能定义一个主键;

mysql中的约束(MySQL中的6种约束你掌握了几种)(1)

在MySQL里,“约束”指的是对表中数据的一种限制约束,它能够确保数据库中数据的准确性和有效性。

比如有的数据是必填项,就像身份认证的时候,或者填注册信息的时候,手机号身份证这种就不能空着,所以就有了非空约束;又有的数据比如用户的唯一id,不能跟其他人的一样,所以就需要使用唯一约束等等。

在MySQL中主要有6种约束:主键约束、外键约束、唯一约束、检查约束、非空约束和默认值约束。

mysql中的约束(MySQL中的6种约束你掌握了几种)(2)

主键约束PRIMARY KEY

“主键约束“是6种约束中使用最多的约束。

在建立数据表的时候,一般情况下,为了方便更快地查找表中的记录,都会要求在表中设置一个“主键”。”主键“是表里面的一个特殊字段,这个字段能够唯一标识该表中的每条信息。

主键分为“单字段主键”和“多字段联合主键”,并且在使用主键的时候需要注意以下几个点:

  • 一个表只能定义一个主键;

  • 主键值必须唯一标识表中的每一行,并且不能出现的情况,即表中不能存在有相同主键的两行或两行以上数据,严格遵守唯一性原则

  • 一个字段名只能在联合主键字段表中出现一次;

  • 联合主键不能包含不必要的多余字段,以满足最小化原则

在建表时设置主键约束:

设置单字段主键:

1)在定义字段的时候设置主键约束,语法格式:

<字段名> <数据类型> PRIMARY KEY [默认值]

例:在数据库中创建学生信息数据表st_info,主键为st_id SQL语句以及运行结果如下:

create table st_info(

st_id int(10) primary key

name varchar(20)

class varchar(10)

gender varchar(4)

age int(2)

);

mysql> desc st_info;

-------- ------------- ------ ----- --------- -------

| Field | Type | | Key | Default | Extra |

-------- ------------- ------ ----- --------- -------

| st_id | int | NO | PRI | | |

| name | varchar(20) | YES | | | |

| class | varchar(10) | YES | | | |

| gender | varchar(4) | YES | | | |

| age | int | YES | | | |

-------- ------------- ------ ----- --------- -------

5 rows in set (0.00 sec)

2)在定义完所有字段之后指定部件,语法格式:

[CONSTRAINT <约束名>] PRIMARY KEY [字段名]

在数据库中创建学生信息数据表st_info2 主键为st_id SQL语句以及运行结果如下:

create table st_info2(

st_id int(10)

name varchar(20)

class varchar(10)

gender varchar(4)

age int(2)

primary key(st_id)

);

mysql> desc st_info2;

-------- ------------- ------ ----- --------- -------

| Field | Type | | Key | Default | Extra |

-------- ------------- ------ ----- --------- -------

| st_id | int | NO | PRI | | |

| name | varchar(20) | YES | | | |

| class | varchar(10) | YES | | | |

| gender | varchar(4) | YES | | | |

| age | int | YES | | | |

-------- ------------- ------ ----- --------- -------

5 rows in set (0.00 sec)

设置联合主键:

联合主键即一张表的主键由多个字段组成。

比如在学生信息表中,可以设置st_id跟name来作为联合主键,语法格式以及SQL语句实现为:

PRIMARY KEY [字段1,字段2,… 字段n]

create table st_info3(

st_id int(10)

name varchar(20)

class varchar(10)

gender varchar(4)

age int(2)

primary key(st_id name)

);

mysql> desc st_info3;

-------- ------------- ------ ----- --------- -------

| Field | Type | | Key | Default | Extra |

-------- ------------- ------ ----- --------- -------

| st_id | int | NO | PRI | | |

| name | varchar(20) | NO | PRI | | |

| class | varchar(10) | YES | | | |

| gender | varchar(4) | YES | | | |

| age | int | YES | | | |

-------- ------------- ------ ----- --------- -------

5 rows in set (0.00 sec)

需要注意的是,在设置联合主键的时候,不能在每个字段名后面直接声明主键约束。

在修改表的时候添加主键约束:

如果在创建表的时候没有设置主键约束,还可以在修改表时进行添加,但是设置成主键约束的字段不允许有空值。语法格式:

ALTER TABLE <数据表名> ADD PRIMARY KEY(<字段名>);

mysql> desc st_info4;

-------- ------------- ------ ----- --------- -------

| Field | Type | | Key | Default | Extra |

-------- ------------- ------ ----- --------- -------

| st_id | int | NO | | | |

| name | varchar(20) | NO | | | |

| class | varchar(10) | YES | | | |

| gender | varchar(4) | YES | | | |

| age | int | YES | | | |

-------- ------------- ------ ----- --------- -------

st_idname设置成主键:

mysql> alter table st_info4 add primary key(st_id name);
Query OK 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql> desc st_info4;
-------- ------------- ------ ----- --------- -------
| Field | Type | | Key | Default | Extra |
-------- ------------- ------ ----- --------- -------
| st_id | int | NO | PRI | | |
| name | varchar(20) | NO | PRI | | |
| class | varchar(10) | YES | | | |
| gender | varchar(4) | YES | | | |
| age | int | YES | | | |
-------- ------------- ------ ----- --------- -------
5 rows in set (0.00 sec)

删除主键约束:

当一个表中不需要主键约束时,就需要从表中将其删除。

删除st_info4数据表中的主键约束:

mysql> alter table st_info4 drop primary key;

Query OK 0 rows affected (0.06 sec)

Records: 0 Duplicates: 0 Warnings: 0

mysql> desc st_info4;

-------- ------------- ------ ----- --------- -------

| Field | Type | | Key | Default | Extra |

-------- ------------- ------ ----- --------- -------

| st_id | int | NO | | | |

| name | varchar(20) | NO | | | |

| class | varchar(10) | YES | | | |

| gender | varchar(4) | YES | | | |

| age | int | YES | | | |

-------- ------------- ------ ----- --------- -------

5 rows in set (0.00 sec)

【补充】 MySQL设置主键自增长 :

在MySQL里,当主键定义为自增长后,主键的值就不需要自己再输入数据了,而是由数据库系统根据定义自动赋值,每增加一条记录,主键就会自动根据设置的步长进行增长。

在MySQL中自增长的关键字是AUTO_INCREMENT,语法格式为:

字段名 数据类型 AUTO_INCREMENT

创建学生信息表st_info5,指定st_id字段自增,

create table st_info5(

st_id int(10) primary key auto_increment

name varchar(20) not

class varchar(10)

gender varchar(4)

age int(2)

);

此时可以不用再手动插入st_id的数据:

insert into st_info5(name class gender age)

values('王思瑶' '管理学1班' '女' 18)

('王绮梦' '管理学1班' '女' 18)

('李若彤' '管理学1班' '男' 18);

mysql> select * from st_info5;

------- -------- ----------- -------- ------

| st_id | name | class | gender | age |

------- -------- ----------- -------- ------

| 1 | 王思瑶 | 管理学1班 | 女 | 18 |

| 2 | 王绮梦 | 管理学1班 | 女 | 18 |

| 3 | 李若彤 | 管理学1班 | 男 | 18 |

------- -------- ----------- -------- ------

3 rows in set (0.01 sec)

但是在设置学号的时候不一定是从1开始的,比如要从2000150001开始,则需要在建表之后设置自增的起始数据:

create table st_info6(

st_id int(10) primary key auto_increment

name varchar(20) not

class varchar(10)

gender varchar(4)

age int(2)

)auto_increment=2000150001;

insert into st_info6(name class gender age)

values('王思瑶' '管理学1班' '女' 18)

('王绮梦' '管理学1班' '女' 18)

('李若彤' '管理学1班' '男' 18);

mysql> select * from st_info6;

------------ -------- ----------- -------- ------

| st_id | name | class | gender | age |

------------ -------- ----------- -------- ------

| 2000150001 | 王思瑶 | 管理学1班 | 女 | 18 |

| 2000150002 | 王绮梦 | 管理学1班 | 女 | 18 |

| 2000150003 | 李若彤 | 管理学1班 | 男 | 18 |

------------ -------- ----------- -------- ------

3 rows in set (0.00 sec)

值得注意的地方是,如果在插入某一行数据产生了报错,则最终自增字段可能会出现不连续的情况。

mysql中的约束(MySQL中的6种约束你掌握了几种)(3)

外键约束FOREIGN KEY

外键约束是表的一个特殊字段,普遍会和主键约束一起使用,用来确保数据的一致性。

对于两个具有关联关系的表来说,相关联字段中主键所在的表就是主表(父表),外键所在的表就是从表(子表)。

所以外键就是用来建立主表与从表的关联关系,为两个表的数据建立连接,约束两个表中数据的一致性和完整性。

在定义外键时需要遵守以下规则:

  • 主表必须已经存在于数据库中,或者是当前正在创建的表。如果是后一种情况,则主表与从表是同一个表,这样的表称做自参照表,这种结构称做自参照完整性;

  • 必须为主表定义主键;

  • 主键不能包含空值,但允许在外键中出现空值;

  • 在主表的表名后面指定列名或列名的组合,这个列或列的组合必须是主表的主键或候选键;

  • 外键中列的数目必须和主表的主键中列的数目相同;

  • 外键中列的数据类型必须和主表主键中对应列的数据类型相同。


在创建表时设置外键约束

在建表语句中,可以加入关键字FOREIGN KEY来指定外键,用REFERENCES来连接与主表的关系语法格式:

CONSTRAINT <约束名>

FOREIGN KEY <外键名>(字段名1,字段名2...)

REFERENCES <主表名>(主键字段名)

① 使用1部分创建的st_info5数据表作为主表:

mysql> desc st_info5;

-------- ------------- ------ ----- --------- ----------------

| Field | Type | | Key | Default | Extra |

-------- ------------- ------ ----- --------- ----------------

| st_id | int | NO | PRI | | auto_increment |

| name | varchar(20) | NO | | | |

| class | varchar(10) | YES | | | |

| gender | varchar(4) | YES | | | |

| age | int | YES | | | |

-------- ------------- ------ ----- --------- ----------------

② 创建tb_1数据表,并在表上创建外键约束,使其中course_id作为外键关联到表st_info5的主键st_id

create table tb_1(

course_id int(8) not auto_increment

course_name varchar(25) not

constraint course_Choosing

foreign key fk_course(course_id)

references st_info5(st_id)

)auto_increment=20015001;

mysql> desc tb_1;

------------- ------------- ------ ----- --------- ----------------

| Field | Type | | Key | Default | Extra |

------------- ------------- ------ ----- --------- ----------------

| course_id | int | NO | MUL | | auto_increment |

| course_name | varchar(25) | NO | | | |

------------- ------------- ------ ----- --------- ----------------

上面语句执行成功之后,在表tb_1中添加了course_Choosing的约束名称,以及外键名称为fk_coursecourse_id字段,依赖于表st_info5的主键st_id

在修改表时添加外键约束

同样的可以在创建表之后再修改,SQL语句如下:

alter table tb_1

add

constraint course_Choosing

foreign key fk_course(course_id)

references st_info5(st_id);

这里需要注意的是,从表的外键关联的必须是主表的主键,且主键和外键的数据类型必须一致。例如两者都是int型或者都是char型数据。

删除外键约束

当一个表中不需要外键约束时,就需要从表中将其删除。外键一旦删除,就会解除主表和从表间的关联关系。

删除的语法格式:

ALTER TABLE <表名>

DROP

FOREIGN KEY <外键约束名>;

alter table tb_1

drop

foreign key fk_course;

mysql中的约束(MySQL中的6种约束你掌握了几种)(4)

唯一约束UNIQUE KEY

唯一约束就是指所有记录中字段的值不能重复出现,比如给'id'字段加上唯一约束之后,每条记录的id值都是唯一的,不能出现重复的情况。

唯一约束与主键约束有一个相似的地方,就是它们都能够确保列的唯一性。与主键约束不同的是,唯一约束在一个表中可以有多个,并且设置唯一约束的列是允许有空值的,虽然只能有一个空值。

例如,在用户信息表中,要避免表中的用户名重名,就可以把用户名列设置为唯一约束。

在创建表时设置唯一约束

唯一约束可以在创建表的时候直接进行设置,通常设置在除了主键以外的其他列上,语法格式如下:

<字段名> <数据类型> UNIQUE

创建图书馆所有书本明细表book_info ,设定书本bk_id为主键,书本ISBN为唯一键,SQL语句如下:

create table book_info(

bk_id int primary key

ISBN varchar(17) unique

author varchar(50)

Publisher varchar(20)

);

mysql> desc book_info;

----------- ------------- ------ ----- --------- -------

| Field | Type | | Key | Default | Extra |

----------- ------------- ------ ----- --------- -------

| bk_id | int | NO | PRI | | |

| ISBN | varchar(17) | YES | UNI | | |

| author | varchar(50) | YES | | | |

| Publisher | varchar(20) | YES | | | |

----------- ------------- ------ ----- --------- -------

4 rows in set (0.00 sec)

在修改表时添加唯一约束

语法格式:

ALTER TABLE <数据表名>

ADD

CONSTRAINT <唯一约束名> UNIQUE(<列名>);


将book_info表中author字段设置为唯一约束:

alter table book_info

add

constraint uni_author unique(author);

mysql> desc book_info;

----------- ------------- ------ ----- --------- -------

| Field | Type | | Key | Default | Extra |

----------- ------------- ------ ----- --------- -------

| bk_id | int | NO | PRI | | |

| ISBN | varchar(17) | YES | UNI | | |

| author | varchar(50) | YES | UNI | | |

| Publisher | varchar(20) | YES | | | |

----------- ------------- ------ ----- --------- -------

4 rows in set (0.01 sec)


删除唯一约束

语法格式:

ALTER TABLE <表名>

DROP INDEX <唯一约束名>;


例 删除book_info表中的唯一约束uni_author;

alter table book_info

drop index uni_author;

mysql> desc book_info;

----------- ------------- ------ ----- --------- -------

| Field | Type | | Key | Default | Extra |

----------- ------------- ------ ----- --------- -------

| bk_id | int | NO | PRI | | |

| ISBN | varchar(17) | YES | UNI | | |

| author | varchar(50) | YES | | | |

| Publisher | varchar(20) | YES | | | |

----------- ------------- ------ ----- --------- -------

4 rows in set (0.00 sec)


本期内容比较干,大家慢慢吸收

剩下三种“约束”下次继续分享

敬请关注喔~

we will come back

本文为爱数据学院作者清零提供

版权归爱数据学院所有,转载请联系后台

mysql中的约束(MySQL中的6种约束你掌握了几种)(5)

球分享

mysql中的约束(MySQL中的6种约束你掌握了几种)(6)

球在看

猜您喜欢: