📖 SQL 表结构定义学习笔记一
【代码总览】
sql
PRIMARY KEY (`id`) USING BTREE,
KEY `fk_brls2_cc` (`carrier_code_id`) USING BTREE,
KEY `fk_loading_seq_ac_reg` (`ac_reg_id`) USING BTREE,
CONSTRAINT `fk_brls2_cc` FOREIGN KEY (`carrier_code_id`) REFERENCES `base_carrier_codes` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT,
CONSTRAINT `fk_loading_seq_ac_reg` FOREIGN KEY (`ac_reg_id`) REFERENCES `base_carr_reg_no` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT
这段代码通常出现在 CREATE TABLE 的尾部,用于定义当前表的主键 、普通索引 以及外键约束。
逐行/逐词详细拆解
第一行:定义主键
PRIMARY KEY (`id`) USING BTREE,
PRIMARY KEY:- 含义:主键声明。
- 作用 :用来唯一标识表中的每一行记录。主键列的值必须唯一,且绝对不能为
NULL。
(id):- 含义 :指定当前表的主键列名为
id。 - 反引号(
) :这是 MySQL 中的标识符引用符。它的作用是防止列名(或表名)与数据库的保留关键字冲突。养成加反引号的习惯是个好习惯。
- 含义 :指定当前表的主键列名为
USING BTREE:- 含义 :指定底层使用 B-Tree(B树/B+树) 数据结构来构建这个索引。
- 作用 :B-Tree 是关系型数据库中最常用的索引结构,非常适合"精确匹配"和"范围查找"(比如
id > 10)。
,(逗号) :- 含义:语法分隔符。表示这一个定义结束,后面还有其他定义。
第二、三行:定义普通索引(辅助查询)
KEY `fk_brls2_cc` (`carrier_code_id`) USING BTREE, KEY `fk_loading_seq_ac_reg` (`ac_reg_id`) USING BTREE,
这两行结构完全一样,我们以第一行为例:
KEY:- 含义 :在 MySQL 中,
KEY是INDEX(索引)的同义词。出现在这里表示"我要创建一个普通索引"。
- 含义 :在 MySQL 中,
fk_brls2_cc:- 含义 :这是你给这个索引取的名字。
- 命名规范 :前缀
fk_通常代表 Foreign Key(外键),这说明设计者特意为后面的外键列建了索引,方便日后管理和排查。
(carrier_code_id):- 含义 :指定该索引要建在哪个具体的列上。这里是建在
carrier_code_id列上。
- 含义 :指定该索引要建在哪个具体的列上。这里是建在
USING BTREE:- 含义 :同样指定使用 B-Tree 算法构建索引,加快基于
carrier_code_id的查询速度。
- 含义 :同样指定使用 B-Tree 算法构建索引,加快基于
第四、五行:定义外键约束(保证数据逻辑)
CONSTRAINT `fk_brls2_cc` FOREIGN KEY (`carrier_code_id`) REFERENCES `base_carrier_codes` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT(注:第五行逻辑同第四行,故此处只剖析第四行)
这是最长、包含信息最多的一行,定义了表与表之间的生死契约。
CONSTRAINT:- 含义:声明一个"约束"。约束是数据库用来强制执行数据校验规则的机制。
fk_brls2_cc:- 含义 :这个约束的名字。注意,这里约束的名字和上面索引的名字一样,这在 MySQL 中是允许且常见的,方便统一管理。
FOREIGN KEY:- 含义:指明这个约束的类型是"外键约束"。
(carrier_code_id):- 含义 :指定当前表中,哪一列充当外键。
REFERENCES:- 含义:"引用"关键字。用来指向目标表(父表)。
base_carrier_codes:- 含义:目标表(父表)的名字。当前表的数据要依赖这张表。
(id):- 含义:目标表(父表)中的列名。通常被引用的都是父表的主键。
- 整体翻译 :当前表的
carrier_code_id里面的值,必须在base_carrier_codes表的id列中真实存在。
ON DELETE CASCADE:- 含义 :删除时的触发动作(级联删除)。
- 作用 :如果有人在
base_carrier_codes表里删除了某条id记录,那么当前表里所有carrier_code_id等于那个id的记录,都会被数据库自动无声无息地删除。
ON UPDATE RESTRICT:- 含义 :更新时的触发动作(限制/拒绝更新)。
- 作用 :如果有人想修改
base_carrier_codes表里某个id的值,但当前表里已经有记录引用了这个id,数据库会直接报错并拒绝这次修改(RESTRICT = 阻止)。想要修改,必须先把当前表里的相关记录清空或改掉。