一、列的约束
1、主键约束(Primary Key)
- 每一个表格内只能有一个列被设置为主键
 - 主键约束通常是用来标记表格中数据是唯一存在的
 - 主键约束要求当前的列是唯一存在的,不能重复,并且不能为空
 
//给student表中的id列添加主键约束,约束名为pk_student
alter table student add constraint pk_student primary key (id); 
 
alter table student modify id int(4) auto_increment;
//或者下面这样设置
alter table student change id id int(4) auto_increment; 
 
desc student;
show keys from student; 
 

 
alter table student drop primary key; 
 
alter table student modify id int(4) null; 
2、唯一约束(Unique [Key])
- 可以为某一列添加唯一约束
 - 唯一约束的列值不能重复,但可以为空
 - 唯一约束可以设置在多个列上
 
//给student表的name列设置唯一约束,约束名为uk_student
alter table student add constraint uk_student unique [key] (name);
//简写,约束名默认的列名
alter table student add unique key(name);    
 
//删除约束名为uk_student的唯一约束
alter table student drop index uk_student;
//没给唯一约束起名,它的约束名默认为列名
alter table student drop index name; 
3、非空约束
- 在某一列添加非空约束
 - 当前的值不能为null
 
//设置student表的name列(非)空,默认值为'光颜'
alter table student modify name varchar(10) [not] null default '光颜';
//另一种设置
alter table student change name name varchar(10) [not] null default '光颜'; 
4、外键约束
- 主表必须已经存在于数据库中,或者是当前正在创建的表。如果是后一种情况,则主表与从表是同一个表,这样的表称为自参照表,这种结构称为自参照完整性。
 - 必须为主表定义主键。
 - 主键不能包含空值,但允许在外键中出现空值。也就是说,只要外键的每个非空值出现在指定的主键中,这个外键的内容就是正确的。
 - 在主表的表名后面指定列名或列名的组合。这个列或列的组合必须是主表的主键或候选键。
 - 外键中列的数目必须和主表的主键中列的数目相同。
 - 外键中列的数据类型必须和主表主键中对应列的数据类型相同。
 
//新建分数表
create table score(
st_id int primary key auto_increment,
cscore int(11)
);
//给score表的st_id列添加外键,关联student的id
alter table score add constraint FK_ID foreign key(st_id) REFERENCES student(id); 
 
//删除score表的外键约束
alter table score drop foreign key FK_ID; 
 
alter table score drop key FK_ID; 
5、检查约束
用来检查列在存值时,范围是否合理
//检查score表的cscore值是否在[0,100]之间
alter table score add constraint ck_cscore check(cscore>=0  and cscore<=100); 
二、表格之间的关系
1、一对一关系
如人与身份证的关系。一个人只有一个身份证号。一个身份证号也对应唯一一个人。这种关系用的比较少,因为一对一的两张表往往可以合并成一张表格。
2、一对多关系
如班级与学生的关系,一个班级可以有多个学生,而一个学生只能在一个班级。
3、多对多关系
如学生与选课之间的关系。一个学生可以选择多门课,一门课也能被多个学生选择。这种关系需要生成一张中间表,记录两张表的对应关系。
三、表格之间的关联查询
1、广义笛卡尔积
广义笛卡尔积将两张表格或多张表格进行无条件的拼接,在拼接后的一张大表格的基础上进行where的筛选。
select * from student,score where student.id=score.st_id; 

2、外连接
select * from student left join score on student.id=score.st_id; 

3、内连接 (自连接)
select * from student inner join score on student.id=score.st_id; 

select * from student s1 inner join student s2 on s1.id=s2.id; 










