高级特性简介

1.约束

1.主键约束
  • 任意两行的主键值都不相同。
  • 每行都具有一个主键值(不允许NULL值)。
  • 主键值不能重用,即从表中删除一行,该行的主键值不分配给新行。
  • 包含主键值的列不修改或更新。

下面我们创建一个学生表,并定义学号为主键:

mysql> CREATE TABLE student
    -> (
    -> id INT(20) UNSIGNED NOT NULL PRIMARY KEY,
    -> name VARCHAR(20) NOT NULL,
    -> sub VARCHAR(10)
    -> )
    -> ;
Query OK, 0 rows affected (0.25 sec)

mysql> desc student;
+-------+------------------+------+-----+---------+-------+
| Field | Type             | Null | Key | Default | Extra |
+-------+------------------+------+-----+---------+-------+
| id    | int(20) unsigned | NO   | PRI | NULL    |       |
| name  | varchar(20)      | NO   |     | NULL    |       |
| sub   | varchar(10)      | YES  |     | NULL    |       |
+-------+------------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

上面id代表学号,用PRIMARY KEY 将其指定为主键。从而该列就具有了主键约束。

我们再新建一个表course,指定课程名称为其主键,我们2步完成。首先建表,然后修改表。过程如下:
建表:

mysql> CREATE TABLE course(name VARCHAR(15) ,count INT UNSIGNED NOT NULL DEFAULT 0);
Query OK, 0 rows affected (0.32 sec)

mysql> DESC course;
+-------+------------------+------+-----+---------+-------+
| Field | Type             | Null | Key | Default | Extra |
+-------+------------------+------+-----+---------+-------+
| name  | varchar(15)      | YES  |     | NULL    |       |
| count | int(10) unsigned | NO   |     | 0       |       |
+-------+------------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

修改约束:

mysql> ALTER TABLE course ADD CONSTRAINT PRIMARY KEY(name);
Query OK, 0 rows affected (0.42 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> DESC course;
+-------+------------------+------+-----+---------+-------+
| Field | Type             | Null | Key | Default | Extra |
+-------+------------------+------+-----+---------+-------+
| name  | varchar(15)      | NO   | PRI |         |       |
| count | int(10) unsigned | NO   |     | 0       |       |
+-------+------------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

其中CONSTRAINT为约束关键字。

2.外键约束

外键:外键是用来实现数据关系完整性的KEY,当表Super的主键是表sub的一个字段时,这个字段就成为Subr的一个外键,其中,Super成为父表,即有外键的表称为子表。即一个表的外键是另一个表的主键。

规则:
①插入非空值时,如果主键表中没有这个值,那么不能插入。
②更新外键时,不能更新为主键表中不存在的值。
③删除或更改主键时,可以选择在建立外键时级联删除/更改还是拒绝删除/更改。
创建的语法:CREATE TABLE 表名(列名 数据类型,id TINYINT ,····,FOREIGN KEY REFERENCE 表名(表的主键));注意:我们要在构建好我们各字段之后,再在最后指定外键。

现在我们将student表的sub字段修改为外键。

mysql> ALTER TABLE student ADD CONSTRAINT FOREIGN KEY(sub) REFERENCES course(nam
e) ON DELETE CASCADE;
Query OK, 0 rows affected (0.64 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc student;
+-------+------------------+------+-----+---------+-------+
| Field | Type             | Null | Key | Default | Extra |
+-------+------------------+------+-----+---------+-------+
| id    | int(20) unsigned | NO   | PRI | NULL    |       |
| name  | varchar(20)      | NO   |     | NULL    |       |
| sub   | varchar(10)      | YES  | MUL | NULL    |       |
+-------+------------------+------+-----+---------+-------+
3 rows in set (0.03 sec)

外键的作用:

  • 帮助防止意外的删除。
  • 级联删除。

例如,要删除一个学生的信息,如果不使用级联删除,我们需要先删除与该学生相关的所有成绩记录,然后删除该学生的信息(学生表为父表,成绩表为子表,其中含外键。)。如果我们开启级联删除,只要在父表中删除该学生的信息记录,那么与之相关的成绩表中的记录也会一并删除。

实例:

首先看一下student表:

mysql> select * from student;
+----+------+------+
| id | name | sub  |
+----+------+------+
| 20 | aaa  | ch   |
| 21 | aaa  | math |
| 22 | aaa  | eng  |
| 23 | aaa  | ch   |
| 24 | aaa  | ch   |
+----+------+------+
5 rows in set (0.00 sec)

course表:

mysql> select * from course;
+------+-------+
| name | count |
+------+-------+
| ch   |     2 |
| eng  |     8 |
| math |     3 |
+------+-------+
3 rows in set (0.00 sec)

启用级联删除:

mysql> ALTER TABLE student ADD CONSTRAINT FOREIGN KEY(sub) REFERENCES course(nam
e) ON UPDATE CASCADE;
Query OK, 5 rows affected (0.74 sec)
Records: 5  Duplicates: 0  Warnings: 0

删除一个课程然后查看student表:

mysql> DELETE FROM course where nam='ch';
ERROR 1054 (42S22): Unknown column 'nam' in 'where clause'
mysql> DELETE FROM course where name='ch';
Query OK, 1 row affected (0.05 sec)

mysql> select * from student;
+----+------+------+
| id | name | sub  |
+----+------+------+
| 21 | aaa  | math |
| 22 | aaa  | eng  |
+----+------+------+
2 rows in set (0.00 sec)

我们可以看到,ch记录被删除了。
具体还有一些外键约束的参照操作,这里不做过多介绍。

3.唯一约束

唯一约束确保该字段的字段值在表中唯一,只需在表创建时在字段定义中加入UNQUE关键字既可。

例如创建一个雇员表:

mysql> CREATE TABLE employee(id INT UNIQUE NOT NULL,name VARCHAR(20));
Query OK, 0 rows affected (0.34 sec)

mysql> DESC employee;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | NO   | PRI | NULL    |       |
| name  | varchar(20) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.02 sec)

从上面我们也可以看出,唯一约束加非空约束其实就是主键约束。

4.检查约束

检查约束的作用是,保证某些字段的值满足某个条件,比如,人的性别只能为男或女。但是貌似在MYSQL中不存在检查约束。

5.非空约束

这个很好理解,一个NOT NULL即可。

2.索引

其实索引我感觉是个‘大头’,在阿里一面的时候我感觉我就是死在这个问题上,这里我先来写几个面试常会被问到的问题:

索引是用来排序数据以加快搜索和排序操作的速度。

  • 索引改善检索操作的性能,但降低数据插入、修改和删除的性能。因为在执行这些操作时,MYSQL必须动态地更新索引。
  • 索引数据可能要占用大量的存储空间。
  • 并非所有数据都适合索引。唯一性不好的数据从索引得到的好处不一定多。
  • 可以在索引中定义多个列。这样的索引仅仅在多个列排序时有用,而按单个列排序,则这种索引没有用处。
  • 索引必须唯一命名。

更详细可以阅读:

索引小讨论

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值