- 主键约束(联合主键约束)
- 唯一性约束
- 非空约束
- 默认值约束
- 外键约束
1、主键约束
它能够唯一确定一张表中的一条记录,增加主键约束之后,就可以使得字段不重复而且不为空
CREATE TABLE user(id INT PRIMARY KEY,name varchar(20));
INSERT INTO user VALUES(1,'张三');
INSERT INTO user VALUES(1,'李四');
返回结果是报错,原因是两个相同的id违反了主键约束。
ERROR 1062 (23000): Duplicate entry '1' for key 'user.PRIMARY'
继续加入一个id为空的数据记录,
INSERT INTO user VALUES(NULL,'Jack');
返回结果报错,原因是受主键约束的字段不能为空。
ERROR 1048 (23000): Column 'id' cannot be null
补充:如果在创建表后想要删除、增加和修改主键,可进行如下操作:
- 增加:ALTER TABLE user ADD PRIMARY KEY(id);
- 删除:ALTER TABLE user DROP PRIMARY KEY;
- 修改:ALTER TABLE user MODIFY id INT PRIMARY KEY;
2、联合主键约束
除了将单一字段作为主键,我们还可以将多个字段组成联合主键,在这种约束下,只要两条数据的字段组合不完全相同即可。
在创建表时候指定联合主键 PRIMARY KEY(字段1,字段2...,字段n)。类似地,我们创建一个user2表,并指定class和name为联合主键。
CREATE TABLE user2(class INT, name VARCHAR(10), PRIMARY KEY(class,name));
插入数据:
INSERT INTO user2 VALUES(1,'张三');
INSERT INTO user2 VALUES(1,'李四');
查询数据:
+-------+------+
| class | name |
+-------+------+
| 1 | 张三 |
| 1 | 李四 |
+-------+------+
联合主键可以描述需要使用两个及以上的字段确定的数据,如使用班级号和班级内的学号确认一个学生。
3、自增约束
自增约束通常搭配主键约束使用,插入数据时如果自增约束的字段未被赋值,系统会自动对当前的最大值加1作为这个字段的值。
注:任何一个字段想要自增,前提本身为索引,而且值为整数。一张表只能有一个自增长。
我们创建一个user3表,并将字段“id”作为主键,加入自增约束(AUTO_INCREMENT)。
CREATE TABLE user3(id int PRIMARY KEY AUTO_INCREMENT, name VARCHAR(10));
INSERT INTO user3(name) VALUES('Jack');
INSERT INTO user3(name) VALUES('Rose');
查询数据:
+----+------+
| id | name |
+----+------+
| 1 | Jack |
| 2 | Rose |
+----+------+
注意:若要指定从某个值开始,则在创建自增约束时,写入AUTO_INCREMENT=开始的值。
4、唯一约束
唯一约束使得该字段的值不能重复。
增加唯一约束的方法(同PRIMARY KEY):
- CREATE TABLE user4(id INT, name VARCHAR(20) UNIQUE);
- CREATE TABLE user4(id INT, name VARCHAR(20),UNIQUE(name));
- ALTER TABLE user4 ADD UNIQUE(name);
- ALTER TABLE user4 MODIFY name VARCHAR(20) UNIQUE;
删除唯一约束:
-ALTER TABLE user4 DROP INDEX name; (注意含INDEX)
同样,也可以为两个及以上字段添加联合约束;
添加UNIQUE约束后,数据表结构中出现UNI:
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| name | varchar(20) | YES | UNI | NULL | |
+-------+-------------+------+-----+---------+-------+
5、非空约束
非空约束描述的字段不允许为空,即必须传入值。
在创建表时候加入非空约束
CREATE TABLE user5(id INT, name VARCHAR(20) NOT NULL);
查看表的结构
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| name | varchar(20) | NO | | NULL | |
+-------+-------------+------+-----+---------+-------+
如果我们增加数据时,没有对id赋值id将自动传入默认值NULL,而name则必须接受一个值的传入,因为其默认值为NULL,但是它受到了非空约束的限制。
6、默认约束
默认约束确定字段在没有值的传入时系统默认的值。还是上述的例子。
ALTER TABLE user5 MODIFY name VARCHAR(20) NOT NULL DEFAULT='佚名';
#传入数据
INSERT INTO user5(id) VALUES(1);
没有再报错,因为虽然没有赋给name值,但是系统传入了默认值’佚名’,满足非空约束。
同样,默认约束可以在创建表时加入。
删除默认值时可以使用上述的MODIFY方法。
7、外键约束
外键约束建立两个表的联系,主表和副表(或父表和子表)。当子表中某个字段加入外键约束时,该字段的值与父表中引用字段的值保持一致。
首先分别创建父表classes和子表students:
CREATE TABLE classes(class_id INT PRIMARY KEY AUTO_INCREMENT, class_name VARCHAR(10));
CREATE TABLE students(student_id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20), class INT,
FOREIGN KEY(class) REFERENCES classes(class_id));
分别插入数据:
INSERT INTO CLASSES (class_name) VALUES ('一班');
INSERT INTO CLASSES (class_name) VALUES ('二班');
INSERT INTO CLASSES (class_name) VALUES ('三班');
INSERT INTO CLASSES (class_name) VALUES ('四班');
INSERT INTO students (name,class) VALUES ('小赵',1);
INSERT INTO students (name,class) VALUES ('小钱',2);
INSERT INTO students (name,class) VALUES ('小孙',3);
INSERT INTO students(name,class) VALUES ('小李',4);
插入一条班级为5班的数据:
INSERT INTO students (name,class) VALUES ('小周',5);
报错:ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails
因为主表中不存在班级5。
再尝试删除班级表中的四班:
DELETE FROM CLASSES WHERE class_id=4;
报错:ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails
不能删除的原因是子表中有数据引用了父表中的班级4这一条数据。
要删除这一条数据,首先删除子表中引用此数据的数据记录。
DELETE FROM STUDENTS WHERE CLASS=4;
DELETE FROM CLASSES WHERE class_id=4;
成功。
通过上述内容可得到两个结论:
- 主表中不存在的数据,副表不可以引用。
- 主表中如果有数据正在被引用,那么主表中该数据不能被删除。如果要删除,就要首先删除子表中相关的数据。
网友评论