1.-
主键约束
它是唯一确定一张表中的一条记录,也就是我们通过给某个字段添加约束,就可以使得改字段不重复且不为空
-
每个字段后方添加
create table user(
id int primary key,
name varchar(20)
)engine=innodb default charset=utf8;
当我们两次插入 primary key 的 id 时:
insert into user values(1, '张三');
insert into user values(1, '张三');
[SQL]insert into user values(1, '张三');
[Err] 1062 - Duplicate entry '1' for key 'PRIMARY'
由于存在主键约束,添加重复的值就会出现错误。
当我们接着插入null值的时候:
INSERT INTO user VALUES(NULL,'李四');
[SQL]INSERT INTO user VALUES(NULL,'李四');
[Err] 1048 - Column 'id' cannot be null
不能为空。
主键条件:
这个字段不能重复且不能为空
目的:就是唯一确定记录
-
放在创建语句最后一起添加
双键约束: 联合主键
-- 只要联合的主键加起来不重复就可以
create table user2(
id int,
name varchar(20),
password varchar(20),
primary key(id, name)
)engine=innodb default charset=utf8;
INSERT INTO user2 VALUES(1,'张三','123');
INSERT into user2 VALUES(2,'张三','123');
INSERT INTO uesr2 VALUES(1,'李四','123');
主键中存在任意一个不同字段即可完成添加
INSERT INTO uesr2 VALUES(1,'李四','123');
[SQL]INSERT INTO user2 VALUES(NULL,'李四','123');
[Err] 1048 - Column 'id' cannot be null
但对于添加而言,字段值仍然不能为空
2.-
自增约束
当主键约束+自增约束时,会自动帮我们管控值
INSERT INTO user3 (name) VALUES ('张三');
INSERT INTO user3 (name) VALUES ('张三');
此时,id会自增
-- 此外,如果我们创建表时,忘记创建主键约束了,如何解决
CREATE TABLE user4(
id INT,
name varchar(20)
)engine=innodb default charset=utf8;
可以通过如下: 修改表结构,添加主键约束
ALTER table user4
add
PRIMARY key(id);
[SQL]ALTER TABLE user10 ADD PRIMARY key(id);
[Err] 1062 - Duplicate entry '1' for key 'PRIMARY'
添加主键约束
,但表中有数据时,未出现提示表中有约束,解决方法,删除表中数据
删除主键约束
ALTER TABLE user4
drop
PRIMARY KEY;
修改主键约束,使用modify
ALTER TABLE 表名
modify
字段名 数据类型 PRIMARY KEY;
3.- 唯一约束
约束修饰的字段的值不能重复
CREATE TABLE user5(
id int,
name varchar;
);
UNIQUE 限制字段唯一,无法重复
ALTER TABLE user5 ADD
UNIQUE
(name);
INSERT INTO user5 VALUES(1,'zhangsan');
INSERT INTO user5 VALUES(1,'zhangsan');
[SQL]INSERT INTO user5 VALUES(1,'zhangsan');
[Err] 1062 - Duplicate entry 'zhangsan' for key 'name'
create table user6(
id int,
name varchar(20),
UNIQUE(name)
);
DESCRIBE user6;
CREATE TABLE user7 (
id int ,
name varchar(20) UNIQUE
);
DESCRIBE user7;
CREATE TABLE user8 (
id int ,
name varchar(20)
UNIQUE(id,name)
);
![](https://i-blog.csdnimg.cn/blog_migrate/618bb4c5e7fe35ecd4ead317317b9468.png)
结果显示user6和user7表格结构中key相同
删除唯一约束
alter table user8
drop
index name;
modify
添加
alrter table user8 modify name varchar(20) unique;
总结
-
建表时就添加约束
-
可以使用alter ... add ...
-
alter ... modify ...
-
删除alter ... drop ...
-- 非空约束
create table user9(
in int,
name varchar(20) not null
)engine=innodb default charset=utf8;
insert into user9(id) values(1,'张三');
-- 默认约束
当我们插入字段值的时候,如果没有传值,就会使用默认值
CREATE TABLE user9 (
id int,
name varchar(20),
age int DEFAULT 10
)
ENGINE=INNODB DEFAULT charset=utf8;
INSERT INTO user10 (id,name) VALUES (1,'张三');
SELECT * from user10;
![](https://i-blog.csdnimg.cn/blog_migrate/d70837766936add1e3ec037ae773e75d.png)
-- 外键约束
涉及到两个表:父表,子表
主表,副表。
-- 班级
CREATE TABLE classes(
id INT PRIMARY KEY,
name varchar(20)
)ENGINE=INNODB DEFAULT charset=utf8;
-- 学生
CREATE TABLE students(
id INT PRIMARY KEY,
name varchar(20),
class_id int,
foreign KEY(class_id) REFERENCES classes(id)
)ENGINE=INNODB DEFAULT charset=utf8;
desc classes;
desc 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);
SELECT * from students;
[SQL]INSERT INTO students VALUES(1005,'李四',5);
[Err] 1452 - Cannot add or update a child row: a foreign key constraint fails (`hello`.`students`, CONSTRAINT `students_ibfk_1` FOREIGN KEY (`class_id`) REFERENCES `classes` (`id`))
INSERT INTO classes VALUES (1,'一班');
INSERT INTO classes VALUES (2,'二班');
INSERT INTO classes VALUES (3,'三班');
INSERT INTO classes VALUES (4,'四班');
SELECT * FROM classes;
-
主表中 classes 中没有的数据值,在副表中,是不可以被使用的。
-
主表中的记录被副表引用时,是不可以被删除的
[SQL]DELETE from classes WHERE id=4;
[Err] 1451 - Cannot delete or update a parent row: a foreign key constraint fails (`hello`.`students`, CONSTRAINT `students_ibfk_1` FOREIGN KEY (`class_id`) REFERENCES `classes` (`id`))