目录
一、约束的种类
1.非空约束(not null) 2.唯一性约束(unique) 3.主键约束(primary key,PK) 4.外键约束(foreign key,FK) 5.检查约束(目前MYSQL不支持,Oracle支持)
二、非空约束(not null)
用NOT NULL约束的字段不能为空值,必须给定具体的数据
默认所有类型的值都可以是NULL,包括INT、FLOAT等数据类型;
非空约束只能在某个列上单独约束,不能组合使用;
一个表可以多列都约束非空;
空字符串不等于NULL,0也不等于NULL
create table test( id int not null, email varchar(20) unique );
三、唯一性约束(unique)
3.1 字段级约束
unique约束的字段具有唯一性,不可重复,但可以为NULL
同一个表可以有多个唯一约束
唯一约束可以是某一个列的值唯一(字段级唯一约束),也可以是多个组合的值唯一(表级唯一约束)
唯一约束允许列值为空
在创建唯一约束的时候,可以给约束命名,如果不命名默认和列名相同
MySql会给唯一约束的列上创建一个唯一索引
create table test( id int not null, email varchar(20) unique ); 在字段上加上唯一约束时,如果插入两个相同的邮箱就会报错
3.2 表级多字段联合约束
表级约束可以给约束起名字(方便后期通过这个名字来删除这个约束)
create table test( id int not null, name varchar(30), email varchar(20), constraint y_user_email unique (name,email) );
constraint是约束关键字,y_user_email是自己给约束起的名字
四、主键约束(primary key,PK)
4.1 主键的概念(一张表例必须有外键的存在)
主键(primary key)是表中的一个或多个字段,它的值用于唯一的标识表中的某一条记录;表中的某个字段添加主键约束后,该字段为主键字段,主键字段中出现的每一个数据都称为主键值
4.2 主键约束与“not null unique”的区别
1、作为Primary Key的域/域组不能为null,而Unique Key可以。 2、在一个表中只能有一个Primary Key,而多个Unique Key可以同时存在。unique not null 可以 将表的一列或多列定义为唯一性属性,而primary key设为多列时,仅能保证多列之和是唯一的,具体到某一列可能会重复。 3、更大的区别在逻辑设计上。Primary Key一般在逻辑设计中用作记录标识,这也是设置Primary Key的本来用意,而Unique Key只是为了保证域/域组的唯一性。
4.3 主键的分类
单一主键:给一个字段加上主键约束 复合主键:给表中的多个字段联合添加一个主键约束(只能用表级定义) 单一主键定义和复合主键定义在一张表中只能出现一次
例:
create table test( id int primary key,-- 单一主键定义 name varchar(30), email varchar(20), constraint y_user_email unique (name,email) primary key(id) -- 表级单一主键定义 primary key(id,name) -- 复合主键定义 );
4.4 自增
在MySQL数据库提供了一个自增的数字,专门用来自动生成主键值,主键值不用用户维护,自动生成,自增数从1开始,以1递增(auto_increment); (1)一个表中只能设置一个自增主键 (2)当需要产生唯一标识符或者顺序值时,可设置自增增长 (3)自增长列约束得咧必须是键列(主键列或者单一键列) (4)自增约束的列的数量类型必须是整数类型 (5)如果自增列指定了0或null,会在当前最大值的基础上自增长,如果自增长列手动指定了具体值,直接赋值具体值
例:
create table test( id int auto_increment, -- 给id设置自增主键 name varchar(30), email varchar(20), constraint y_user_email unique (name,email), primary key(id) -- 表级单一主键定义 );
五、外键约束(foreign key,FK)
外键:用于与另一张表的关联。是能确定另一张表记录的字段,用于保持数据的一致性。若有两个表A、B,id是A的主键,而B中也有id字段,则id就是表B的外键; A为基本表或父标,主表,B为信息表,子表,副表; 只能是表级定义; foreign key(表的字段名) references 父表表名(父表的字段名); 某个字段添加外键约束之后,该字段称为外键字段,外键字段中每个数据都是外键值;
外键的分类
按外键约束的字段数量分类: 单一外键:给一个字段添加外键约束; 复合外键:给多个字段联合添加一个外键约束; 注意: 一张表可以有多个外键字段(与主键不同); 外键值可以为null; 外键字段去引用一张表的某个字段的时候,被引用的字段必须具有unique约束有了外键引用之后,表分为父表和子表;
例:
学生表: create table student( id int auto_increment, sname varchar(10) not null, brithday datatime, ssex char(4), primary key(id) ) 班级表 create table class( sid int , cid int primary key, cname char(10), foregin key(sid) reference classtab(id)-- 创建外键 )
六、添加约束
6.1 添加非空约束
alter table 表名modify test_studentchar(10) not null;
6.2 添加唯一约束
alter table 表名add unique(表字段名,字段,字段,字段);
6.3 添加主键约束
alter table 表名add primary key(表的字段名,字段,字段);
6.4 添加外键约束
alter table 表名add constraint N1 foreign key (表字段名) references 父表(父表字段名);
七、约束的删除
7.1 删除非空约束
alter table 表名modify 列名类型;
7.2 删除唯一约束
alter table 表名drop index 唯一约束名
7.3 删除主键约束
alter table 表名drop primary key;
7.4 删除外键约束
alter table 表名drop foreign key 外键名;