1、常用的约束

主键约束:primary key     

非空约束:not null    

唯一约束:unique     

外键约束:foreign key     

——————————————————————————————————————

2、约束的添加与删除

主键、唯一、非空约束的添加删除都可以直接modify字段属性来完成。


主键约束:

alter table [table_name] add constraint [constraint_name] [unique| primary key|foreign key] ([column_name])

alter table person add [constraint] primary key(pid);添加主键约束

alter table person modify pname varchar(50) primary key;添加

alter table person drop primary key;删除主键约束


唯一性约束

alter table person add unique(pname); 添加唯一性约束

alter table person drop index pname;删除唯一性约束

alter table person modify pname varchar(49) unique;直接alter添加


非空约束:

alter table person modify pname varchar(45) not null;添加非空约束

alter table person modify pname varchar(45) null; 删除非空约束


外键约束:

alter table student add foreign key(lesson_id) references lesson(lesson_id) on delete cascade; 添加外键约束

alter table student drop foreign key student_ibfk_1; 删除外键约束,如无指定名称系统会自动创建约束名称

外键约束使用最多的两种情况:

1) 父表更新时子表也更新,父表删除时如果子表有匹配的项,删除失败。

2)父表更新时子表也更新,父表删除时子表匹配的项也删除。

要求:

 1. 建立外键关系的对应列数据类型应一致(或相似?)。

 2. 建立外键关系的对应列(references列)必须建立了索引(唯一性约束)。

 3. 添加约束事可以给出key_name,但key_name在数据库中必须是唯一的。否则,引擎会自动的创建。

——————————————————————————————————————

3、级联删除、级联置空

添加外键约束的时候,需要级联删除,或者级联设置为null


外键的添加可以使用如下两种方式:

级联删除:(删除部门表中数据的同时会删除雇员表中关联的记录)

alter table emp add foreign key (dept_id) references dept(id) on delete cascade;


级联置空:(删除部门表中数据同时将雇员表中关联记录外键的值设置为null;)

alter table emp add foreign key (dept_id) references dept(id) on delete set null;


create table company (

id int primary key auto_increment,

name varchar(100)

);

create table stock(

id int primary key auto_increment,

code varchar(50),

cid int unique

);

——————————————————————————————————————

4、数据关系

关系:一对一,一对多,多对多

1)、one2many关系通常借助:FK实现

外键要建立在多的一端,由many维护关系


2)、one2one 关系的实现通常借助:FK+UK

对于次关系而言,外键建立在那一端,取决于具体业务。


3)、many2many需要借助中间表来实现

create table stu(

id int primary key,

sname varchar(20) not null

);

create table course(

id int primary key,

cname varchar(20) not null

);

建立中间表s_c通常叫关系表

create table s_c(

sid int ,

cid int,

primary key(sid, cid)

);复合主键


一般不建议在建表的时候设置外键

alter table s_c add foreign key (sid) references stu(id) on delete cascade;

alter table s_c add foreign key (cid) references course(id) on delete cascade;


insert into stu values(1, 'SA'),(2, 'SC');

insert into course values(1, 'CA'),(2, 'CC');

insert into s_c values(1,1),(1,2),(2,1),(2,2);

——————————————————————————————————————