美文网首页
sql学习笔记3-约束

sql学习笔记3-约束

作者: 风一样的我1 | 来源:发表于2020-10-01 21:51 被阅读0次
  • 主键约束(联合主键约束)
  • 唯一性约束
  • 非空约束
  • 默认值约束
  • 外键约束

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;

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

  • 主表中不存在的数据,副表不可以引用。
  • 主表中如果有数据正在被引用,那么主表中该数据不能被删除。如果要删除,就要首先删除子表中相关的数据。

相关文章

  • sql学习笔记3-约束

    主键约束(联合主键约束) 唯一性约束 非空约束 默认值约束 外键约束 1、主键约束 它能够唯一确定一张表中的一条记...

  • SQL学习笔记——约束(重要!!!)

    约束(重要!!!) 约束:在创建表时给表中的字段加上一些约束,来保证表中数据的完整性,有效性 类型: 非空约束:n...

  • SQL基础01

    什么是SQL SQL中常用的关键字 SQL中的语句的种类 SQL中约束 简单约束: 示例: 主键: 添加主键约束原...

  • Oracle SQL 学习笔记14- 约束

    约束(Constraint)概要 约束是强加在表上的规则或条件。确保数据库满足业务规则。保证数据的完整性。当对表进...

  • sql中表级约束和列级约束

    sql中表级约束和列级约束,在SQL SERVER中, (1) 对于基本表的约束分为列约束和表约束 约束是限制用户...

  • 李善友课程笔记3-李善友教授如何从读书中学习?

    李善友课程笔记3-李善友教授如何从读书中学习?

  • SQL学习笔记2-数据库基本查询语句

    本库为SQL的学习笔记:数据库语句的基本使用,以终端操作Mysql为例,包括增删改查,约束条件,分类查询语句等。此...

  • 数据库(2)

    SQL 约束(Constraints) SQL 约束用于规定表中的数据规则。如果存在违反约束的数据行为,行为会被约...

  • SQL 笔记系列四(约束)

    前言 SQL 约束用于规定表中的字段数据规则。就是为字段添加一些限制要求。如果在操作字段时,数据格式不符合所规定的...

  • 数据库基础知识整理-SQL约束和使用

    数据库基础知识整理-SQL约束和使用 SQL约束 SQL 约束用于规定表中的数据规则,可以在创建表时规定(通过 C...

网友评论

      本文标题:sql学习笔记3-约束

      本文链接:https://www.haomeiwen.com/subject/qwduuktx.html