MySQL建表约束
一、主键约束
1、作用:它能够唯一确定一张表中的一条记录,也就是我们通过某个字段添加约束,就可以使得该字段不重复且不为空。
create table user(
id int primary key,
name varchar(20)
);
使用peimary key 修饰后,插入(insert) id就不能为空和重复了。
2、多个数据加主键约束
联合约束:联合约束可以在最后添加上primary key(value1,value2)
create table user(
id int primary key,
name varchar(20),
primary key (id,name)
);
联合主键和单个主键一样,任何一个数据都不能为空。但只有当联合主键里所有键都重复才不能重复。
二、自增约束
1、作用:自增约束和主键约束primary key 搭配在一起可以自动帮我们输入并增加数据值
create table user(
id int primary key auto_increment,
name varchar(20),
);
因此当我们输入
insert into user (name) values(‘张三’);
时,数据表自动变成了。 1 张三
三、唯一约束
作用:约束修饰的字段的值不可以重复。(可以为空)
create table user(
id int,
name varchar(20) ,
unique(name),
);
因此name不能重复。如果使用unique(name,id)则表示这两个键在一起不重复就行。
四、非空约束
作用:修饰的字段不能为空NULL。
create table user(
id int,
name varchar(20) not null
);
此时name不能为空。
五、默认约束
作用:插入字段的时候,如果没有传值,就会使用默认值
create table user
id int,
name varchar(20),
age int default 10
);
此时,使用
insert into user(id,name) values(‘1’,‘张三’);
会发现,并没有给age传值,但表为 1 张三 10
六、 外键约束
涉及到两个表:父表,子表(主表,副表)。
创建班级表:
create table classes(
id int primary key,
name varchar(20),
);
创建学生表:
create table students(
id int primary key,
name varchar(20),
class_id int,
foreign key(class_id) references classes(id)
);
insert int (name) classes values(1,'一班');
insert int (name)classes values(3,'二班');
insert int (name) classes values(4,'三班');
insert int (name) classes values(4,'四班');
insert into student values (1001,'张三',1);
insert into student values (1002,'李四',5);//此时会报错。
外键约束作用:
1.主表classes中没有的数据值,在副标(子表)中,是不可以使用的
2.主表中的记录被副表引用,是不可删除的。
七、 如果说我们建表时忘记创建约束了,怎么办?
create table user(
id int,
name varchar(20),
);
1、添加约束
alter table user add primary key(id);
2、删除约束
alter table user drop primary key;
注意:删除指定字段约束是:(加上index 与字段名)
alter tabe user drop index name;
3、使用modify修改字段添加约束
alter tabll user modify id int primary key;
4、foreign key 不能添加常见原因:
1.检查是否指向的键是主键。
2.检查是否已经建立了索引,一个外键必然会有一个索引。
3.检查是否表内已经存有数据,导致约束失败
4.检查被参考键和参考键的类型是否相同
5.检查是否重建了同名的索引,比如第一次建立失败,再次建立可能会因为索引重复导致失败
6.检查是否在键上设置了unsigned。
7、表类型是否相同,如一个为MyISAm一个为InnoDB