sql学习笔记3-约束

2020-10-01  本文已影响0人  风一样的我1

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

补充:如果在创建表后想要删除、增加和修改主键,可进行如下操作:

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):

+-------+-------------+------+-----+---------+-------+
| 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;

成功。
通过上述内容可得到两个结论:

上一篇 下一篇

猜你喜欢

热点阅读