今天我们学习MySQL数据库的高级特性
首先我们先创建测试表
mysql> create database jx;
Query OK, 1 row affected (0.00 sec)mysql> use jx
Database changed
mysql> create table users (-> id int not null primary key auto_increment,-> username varchar(50) not null,-> password varchar(50) not null,-> key idx_username (username)-> ) ;
Query OK, 0 rows affected (0.02 sec)mysql> create table orders (-> order_id int not null primary key auto_increment,-> user_id int,-> owner varchar(50) not null,-> level int not null,-> age int,-> key idx_user_id (user_id)-> ) ;
Query OK, 0 rows affected (0.01 sec)mysql> show tables;
+--------------+
| Tables_in_jx |
+--------------+
| orders |
| users |
+--------------+
2 rows in set (0.00 sec)mysql> desc orders;
+----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+----------------+
| order_id | int | NO | PRI | NULL | auto_increment |
| user_id | int | YES | MUL | NULL | |
| owner | varchar(50) | NO | | NULL | |
| level | int | NO | | NULL | |
| age | int | YES | | NULL | |
+----------+-------------+------+-----+---------+----------------+
5 rows in set (0.01 sec)mysql> desc users;
+----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| username | varchar(50) | NO | MUL | NULL | |
| password | varchar(50) | NO | | NULL | |
+----------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
一、主键(Primary Key)
特性
唯一标识一条记录,不能有重复值
一个表只能有一个主键
可以是单列或多列的组合
自动定义为 NOT NULL
作用
数据的唯一性标识:通过为主表中的每一行数据分配一个唯一的主键值,可以在整个表甚至整个数据库的范围内准确地识别和区分每一条记录。
数据的完整性维护:主键的非空和唯一性约束强制保证了数据的完整性。当插入或更新数据时,数据库会自动检查主键值是否满足要求,若不满足则拒绝操作,防止出现重复或无效的数据。
提高查询性能:由于主键自带索引,在根据主键进行查询时,数据库能够快速定位到目标记录,大大减少了查询所需的时间和资源,尤其是在处理大型数据集时效果更为显著。
建立表间关系的基础:在关系型数据库中,主键常用于建立不同表之间的关联关系。通过将一个表的主键作为另一个表的外键,可以实现多表之间的数据关联和操作,如连接查询、级联操作等。
创建
mysql> create table users (-> id int auto_increment,-> username varchar(50) not null,-> password varchar(50) not null,-> primary key (id)-> ) ;
修改
不直接支持修改现有的主键约束,但你可以删除并重新创建它:
mysql> create table info(id int primary key);
Query OK, 0 rows affected (0.01 sec)mysql> desc info;
+-------+------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------+------+-----+---------+-------+
| id | int | NO | PRI | NULL | |
+-------+------+------+-----+---------+-------+
1 row in set (0.00 sec)mysql> alter table info drop primary key;
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0mysql> desc info;
+-------+------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------+------+-----+---------+-------+
| id | int | NO | | NULL | |
+-------+------+------+-----+---------+-------+
1 row in set (0.00 sec)mysql> alter table info add primary key (id);
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0mysql> desc info;
+-------+------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------+------+-----+---------+-------+
| id | int | NO | PRI | NULL | |
+-------+------+------+-----+---------+-------+
1 row in set (0.00 sec)
删除
mysql> alter table info drop primary key;
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
二、外键(Foreign Key)
特性
确保子表中的数据在父表中有对应值
可以实现级联更新和删除
外键一定是某一张表的主键
作用
维护数据一致性:外键约束强制从表中的外键值必须与主表中的主键值相对应,防止出现孤立的数据或无效的引用。当在主表中删除或更新一条记录时,数据库会根据外键约束的设置,自动处理从表中与之相关的记录,确保数据的一致性和完整性。
实现多表关联操作:通过外键可以方便地将多个表关联起来,以便在查询和操作数据时能够从多个相关表中获取所需的信息。这种关联使得数据库能够模拟现实世界中的复杂关系,如客户与订单、学生与课程等关系,从而更好地组织和管理数据。
简化数据模型设计:使用外键可以清晰地表达不同表之间的关系,使数据库的数据模型更加规范化和易于理解。在设计数据库结构时,合理地使用外键可以避免数据的冗余存储,提高数据的存储效率和可维护性。
创建
CREATE TABLE orders (
order_id INT AUTO_INCREMENT,
user_id INT,
owner varchar(50) NOT NULL,
level int NOT NULL,
age int,
PRIMARY KEY (order_id),
FOREIGN KEY (user_id) REFERENCES users(id)
);
修改
通常,外键是在创建表的时候一同定义的,修改外键需要先删除再重新创建:
ALTER TABLE orders DROP FOREIGN KEY orders_ibfk_1;
ALTER TABLE orders ADD CONSTRAINT orders_ibfk_1 FOREIGN KEY (user_id) REFERENCES new_users(id);
语句结构及含义
ALTER TABLE:这是 SQL 中的关键字组合,用于修改已存在的表结构。在这里,它表明接下来要对 orders 表进行某种结构上的变更操作。
orders:是你要修改的目标表的名称,也就是想要在这个表上添加外键约束的表。
ADD CONSTRAINT fk_user_id:
ADD CONSTRAINT 表示要添加一个约束条件。约束条件可以是多种类型,比如主键约束、外键约束、唯一约束等,在这里明确是要添加外键约束。
fk_user_id 是给这个外键约束起的名字。给外键约束命名是一个良好的实践,方便后续在查看表结构、处理约束相关问题(比如删除约束)时能够清晰地识别它。
FOREIGN KEY (user_id):指定了在 orders 表中的哪一列将作为外键列,这里是 user_id 列,意味着该列的值将与另一个表中的主键或唯一键列建立关联,以确保数据的参照完整性。
REFERENCES new_users(id):指出了外键所引用的表和列。
REFERENCES 是用于表示引用关系的关键字。
new_users 是被引用的主表名称,表明 orders 表中的外键列 user_id 的值需要参照 new_users 表中的 id 列来取值,并且 new_users 表中的 id 列通常应为主键或者唯一键,这样才能保证数据的一致性和完整性。
总结
主键是为了唯一标识一行数据并且能够达到快速检索的所用(会自动生成主键索引),外键是为了让表之间能够建立好级联操作以保证当前数据的一致性。
三、索引(Index)
特性
通过快速定位数据来提高查询速度
可以是唯一的(unique)或非唯一的
类型(了解)
按数据结构分类可分为:B+tree索引、Hash索引、Fulltext索引。
按物理存储分类可分为:聚簇索引、二级索引(辅助索引)。
按字段特性分类可分为:主键索引、普通索引、前缀索引。
按字段个数分类可分为:单列索引、联合索引(复合索引、组合索引)。