MySQL之约束(主键、唯⼀、⾮空、⾃增、外键)MySQL 之约束(主键、唯⼀、⾮空、⾃增、外键)
⽬的:使得数据更准确,更完整。
约束的分类:
1、键约束
(1)主键约束
(2)唯⼀键约束
(3)外键约束
2、⾮空约束
3、默认值约束
4、⾃增约束
主键约束
(⼀)概述
1、关键字 :primary key
2、特点:增加主键约束的列(字段)的值必须是⾮空 + 唯⼀的,⼀个表只有⼀个主键约束
3、作⽤:保证表中不会出现两条⽆法区分的记录
4、要求:每⼀张表都必须有主键约束
5、分类
单列主键约束
复合主键约束
(⼆)使⽤主键约束
1、创建主键约束
(1)在建表时指定主键约束
create table 【数据库名.】表名称(
字段1数据类型 primary key,
字段2数据类型,
....
);
create table 【数据库名.】表名称(
字段1数据类型,
字段2数据类型,
....,
primary key(字段1)
);
例如:
create table dept(
id int primary key,
name varchar(20),
description varchar(100)
);
create table dept(
id int,
name varchar(20),
description varchar(100),
primary key(id)
);
mysql> desc dept;
+-------------+--------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+-------+
| id          |int(11)| NO  | PRI | NULL    ||
| name        |varchar(20)| YES  || NULL    ||
| description |varchar(100)| YES  || NULL    ||
+-------------+--------------+------+-----+---------+-------+
insert into dept values(1,'财务部','发钱的');
insert into dept values(1,'财务部','发钱的');
mysql> insert into dept values(1,'财务部','发钱的');
ERROR 1062(23000): Duplicate entry '1'for key 'PRIMARY'
(2)建表后指定主键约束
create table dept(
id int,
name varchar(20),
description varchar(100)
);
修改表结构:
alter table dept add primary key(id);
2、删除主键约束
修改表结构
alter table 表名称 drop primary key;
例如:
alter table dept primary key;
3、复合主键
(1)在建表时指定主键约束
create table 【数据库.】表名称(
字段1数据类型,
字段2数据类型,
字段3数据类型,
.
..,
primary key(字段列表)
);
说明:复合主键不能在列后⾯加,需要单独指定
(2)建表后指定主键约束
alter table 【数据库.】表名称 add primary key(字段列表);
例如:
create table stu(
sid int primary key,  #学号
sname varchar(20)  #姓名
);
create table course(
cid int primary key,  #课程编号
cname varchar(20)  #课程名称
);
create table score(
sid int,  #学号
cid int,  #课程编号
foreign key references用法score int  #对应的成绩
);
insert into stu values(1,'张三'),(2,'李四');
insert into course values(1001,'java'),(1002,'mysql');
insert into score values(1,1001,89),(1,1002,90),(2,1001,56),(2,1002,69);
mysql>select* from stu;
+-----+-------+
| sid | sname |
+-----+-------+
|1|张三|
|2|李四|
+-----+-------+
2 rows in set (0.00 sec)
mysql>select* from course;
+------+-------+
| cid  | cname |
+------+-------+
|1001| java  |
|1002| mysql |
+------+-------+
2 rows in set (0.00 sec)
mysql>select* from score;
+------+------+-------+
| sid  | cid  | score |
+------+------+-------+
|1|1001|89|
|1|1002|90|
|2|1001|56|
|2|1002|69|
+------+------+-------+
4 rows in set (0.00 sec)
alter table score add primary key(sid,cid);
create table score(
sid int,  #学号
cid int,  #课程编号
score int,  #对应的成绩
primary key(sid,cid)
)
;
变通成如下这种:
create table score(
id int,  #没有业务意义,只是唯⼀标记⼀⾏
sid int,  #学号
cid int,  #课程编号
score int,  #对应的成绩
primary key(id)
);
唯⼀键约束
(⼀)概述
1、关键字:unique key
2、特点:指定了唯⼀键的列的值必须唯⼀,不能重复
3、作⽤:给主键以外的列,限定唯⼀性
4、唯⼀键分类
单列的唯⼀
复合唯⼀
唯⼀键和主键的区别:
(1)主键不能为空,唯⼀键可以为空
(2)主键约束,⼀个表只能有⼀个,⽽唯⼀键可以有很多个(⼆)使⽤唯⼀键
create table 【数据库名.】表名称(
字段1数据类型  primary key,
字段2数据类型【unique key】,
字段3数据类型【unique key】,
...
);
create table 【数据库名.】表名称(
字段1数据类型  primary key,
字段2数据类型,
字段3数据类型,
...,
unique key(字段2),  #分别唯⼀
unique key(字段3)
);
create table 【数据库名.】表名称(
字段1数据类型  primary key,
字段2数据类型,
字段3数据类型,
...,
unique key(字段列表)  #复合唯⼀
);
create table emp(
eid int primary key,  #员⼯编号
ename varchar(20),  #姓名
cardid varchar(18)  unique key,  #⾝份证号
tel varchar(11) unique key
);
insert into emp values(1,'张三','123456789123456789','12345678912');
insert into emp values(2,'李四','123456789123456788','12345678912');
mysql> insert into emp values(2,'李四','123456789123456788','12345678912');
ERROR 1062(23000): Duplicate entry '12345678912'for key 'tel'
(2)在建表后
修改表结构:
alter table 【数据库名.】表名称 add unique key(字段名);
alter table 【数据库名.】表名称 add unique key(字段列表);  #复合唯⼀
2、删除唯⼀键
修改表结构:
alter table 【数据库名.】表名称 drop index 索引名;
如果不知道索引名,可以通过如下的语句查询:
show index from 表名称;
alter table emp drop unique key;  #错误的
alter table emp drop unique key(cardid);  #错误的
alter table emp drop index cardid;
索引:index
作⽤:为了提⾼查询效率,⽽设置索引
我们的键约束(主键、唯⼀键、外键),都会⾃动创建索引。
因为既然你建⽴键约束,那么该列的值⼀定很关键,那么在实际中肯定经常⽤他们的值来查询。因此,为了提⾼查询效率,会⾃动在这些列上增加索引。
⾮空和默认值约束
create table emp(
eid int primary key,  #员⼯编号
ename varchar(20) not null,  #姓名
cardid varchar(18)  unique key not null ,  #⾝份证号
tel varchar(11) unique key not null,
gender char not null default'男'
);
insert into emp values(1,'张三','111','10086','⼥');
insert into emp values(2,'李四','111','⼥');  #错误的,原因是值的数量和列的数量不匹配
insert into emp(eid,ename,cardid,gender)values(2,'李四','111','⼥');  #错误的因为tel设置⾮空,但是⼜没指定默认值insert into emp(eid,ename,cardid,tel)values(2,'李四','222','10010');
insert into emp values(3,'王五','3333','10011',default);
(2)建表后
create table 【数据库名.】表名称(
字段1数据类型 primary key,
字段2数据类型【unique key】【not null】【default默认值】,
字段2数据类型【unique key】【not null】【default默认值】,
...
);
create table emp(
eid int primary key,  #员⼯编号
ename varchar(20) not null,  #姓名
cardid varchar(18)  unique key  ,  #⾝份证号
tel varchar(11) unique key ,
gender char
);
alter table emp modify cardid varchar(18) unique key  not null;
alter table emp modify tel varchar(11)  not null;
alter table emp modify gender char not null default'男';
2、如何去掉⾮空和默认值约束
alter table emp modify gender char ;
⾃增约束
1、关键字:auto_increment
2、特点:
(1)⼀个表只能有⼀个⾃增列
(2)⾃增列必须是整型的
(3)⾃增列必须是键列,例如:主键,唯⼀键
3、如何指定⾃增
create table emp(
eid int primary key auto_increment,
ename varchar(20) not null
);
insert into emp values(2,'张三');
insert into emp(ename)values('李四');
insert into emp values(0,'王五');
insert into emp values(null,'赵六');

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。