mysql建表约束
1.主键约束
它能够唯一确定一张表中的一条记录,也就是我们通过给某个字段添加约束,就可以使得该字段不重复且不为空。
create table user(id int primary key, name varchar(20));
insert into user values(1, '张三');
#Query OK, 1 row affected (0.10 sec)
insert into user values(1, '张三');
#如果重复输入两次会报错:ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
insert into user values(2, '张三');#可添加
insert into user values(NULL, '张三');
#ERROR 1048 (23000): Column 'id' cannot be null
2.复合主键
任何一个都不可为空
create table user2(id int,
name varchar(20),
password varchar(20),
primary key(id, name));
insert into user2 values(1, '张三', '123');
mysql> insert into user2 values(1, '张三', '123');#可以
insert into user2 values(1, '张三', '123');#报错
insert into user2 values(2, '张三', '123');#可以
insert into user2 values(1, '李四', '123');#可以
insert into user2 values(NULL, '李四', '123');#报错
3.自增约束auto_increment
create table user3(id int primary key auto_increment,
name varchar(20));
insert into user3 (name) values('zhangsan');
#管控id的值,使得其自动增长
创建表的时候,忘记创建主键约束了,怎么办?
create table user4(id int ,
name varchar(20));
user4.png
"key"中没有信息
alter table user4 add primary key(id); 修改表结构,添加主键约束
添加了主键约束的user4.png
alter table user4 drop primary key; #删除:drop
alter table user4 modify id int primary key; #修改:modify
4.唯一约束
约束修饰的字段的值不可以重复
create table user5(
id int,
name varchar(20));
alter table user5 add unique(name);#添加唯一约束
user5.png
UNI:不可修改
insert into user5 values(1, 'zhangsan');#可以插入
insert into user5 values(1, 'zhangsan');#重复添加会报错
#ERROR 1062 (23000): Duplicate entry 'zhangsan' for key 'name'
insert into user5 values(1, 'lisi');#成功添加
create table user6(
id int,
name varchar(20),
unique(name)); #添加唯一约束的其他方法
create table user7(
id int,
name varchar(20) unique); #添加唯一约束的其他方法
create table user8(
id int,
name varchar(20) ,
unique(id, name)); #添加唯一约束的其他方法
#unique(id, name)表示两个键在一起不重复就ok
#---如何删除唯一约束?
alter table user7 drop index name;
#---如何添加唯一约束?modify
alter table user7 modify name varchar(20) unique;
总结:
- 建表的时候就添加约束
- 使用alter...,add...
- alter...modify...
- 删除使用alter..., drop...
5.非空约束
约束修饰的字段的值不为空
create table user9(
id int, name varchar(20) not NULL);
user9.png
注意user9的Null列
insert into user9(id) values(1);
#ERROR 1364 (HY000): Field 'name' doesn't have a default value
insert into user9 values(1, '张三'); #成功
insert into user9(name) values('李四'); #成功
+------+--------+
| id | name |
+------+--------+
| 1 | 张三 |
| NULL | 李四 |
+------+--------+
6.默认约束
当我们插入字段值的时候,如果没有传值,就会使用默认值
create table user10(
id int,
name varchar(20),
age int default 10
);
user10.png
insert into user10(id, name) values(1, 'zhangsan');
+------+----------+------+
| id | name | age |
+------+----------+------+
| 1 | zhangsan | 10 |
+------+----------+------+
#默认填入age=10
insert into user10 values(1, 'zhangsan', 19);
+------+----------+------+
| id | name | age |
+------+----------+------+
| 1 | zhangsan | 10 |
| 1 | zhangsan | 19 |
+------+----------+------+
#age为输入的值
#传了值,就不使用默认值
7.外键约束
涉及到两个表:父表/主表,子表/副表
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)
);#学生表
#向classes表中添加数据
insert into classes values(1, '一班');
insert into classes values(2, '二班');
insert into classes values(3, '三班');
insert into classes values(4, '四班');
#向students表中添加数据
insert into students values(1001, '张三', 1);
insert into students values(1002, '张三', 2);
insert into students values(1003, '张三', 3);
insert into students values(1004, '张三', 4);
insert into students values(1005, 'lisi', 5); #报错
#ERROR 1452 (23000): Cannot add or update a child row:
# a foreign key constraint fails (`test`.`students`, CONSTRAINT
#`students_ibfk_1` FOREIGN KEY (`class_id`) REFERENCES `classes` (`id`))
#1.主表classes中没有的数据值在副表中是不可以使用的
#2.主标中的记录被副表引用,是不可以被删除的
delete from classes where id=4; #报错