MySQL外键约束中RESTRICT与NOACTION效果一致,均禁止主表删除或更新被引用的数据。外键还支持CASCADE、SETNULL、SETDEFAULT等选项,使用时需注意字段类型一致、建立索引以及保证主表引用完整性等细节。
创建外键约束的语法结构清晰明了,直接书写如下:

长期稳定更新的攒劲资源: >>>点此立即查看<<<
[CONSTRAINT [symbol]] FOREIGN KEY [index_name] (col_name, ...) REFERENCES tbl_name (col_name,...) [ON DELETE reference_option] [ON UPDATE reference_option]reference_option: RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT
接下来拆解这个语法结构。其中CONSTRAINT [symbol]用于指定约束名称,若省略,系统会自动生成。值得注意的是,MySQL要求外键约束的列上必须存在索引,[index_name]用于指定该索引名,同样不写时会自动生成。如果已有支持该外键约束的索引,则指定的索引名失效,系统直接采用已有索引。
而[ON DELETE reference_option]和[ON UPDATE reference_option]决定了当主表执行update或delete操作时,子表对应数据的响应方式。来看一个具体示例:
create table tab1 (id int primary key); create table tab2 (id int primary key, col1 int, foreign key (col1) references tab1(id));
那么,reference_option有哪些可选参数?各自含义是什么?
1. CASCADE:级联删除或级联更新。主表删除被其他表引用的数据时,子表对应数据也会被删除;主表更新时,子表同样更新。操作简单直接。
2. SET NULL:主表删除或更新被引用的数据后,子表对应字段会被设为null。但需注意,子表外键字段不能为not null,否则该选项无效。
3. RESTRICT:主表不允许删除或更新被其他表引用的数据。若创建外键时未指定任何[ON DELETE reference_option]或[ON UPDATE reference_option],默认行为即为RESTRICT。
4. NO ACTION:在MySQL中,其效果与RESTRICT完全相同。
5. SET DEFAULT:此选项在InnoDB和NDB存储引擎中无法使用,基本可忽略。
若表已存在,需要为已有表添加外键约束,语法如下:
ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] FOREIGN KEY [index_name] (col_name, ...) REFERENCES tbl_name (col_name,...) [ON DELETE reference_option] [ON UPDATE reference_option]
基本语法参数与建立外键时相同,此处不再重复说明。
删除外键的操作更为简单:
ALTER TABLE tbl_name DROP FOREIGN KEY fk_symbol;
其中fk_symbol为外键约束名称。若忘记约束名,可使用show create table tab_name\G查看表创建语句,其中会明确列出所有约束名称。
使用外键时,需注意以下几个细节:
1. 外键上无法插入主表中不存在的数据,也无法将外键更新为主表中不存在的数据。这是最基本的数据完整性保障。
2. 外键列上必须存在索引,这一点前文已提及。但更关键的是,主表被引用的列最好也建立索引。因为子表插入数据时,MySQL需要到主表对应列检查数据是否存在,索引能显著提升检查效率。
3. 若一个表被其他表的外键引用,则该表无法直接删除。如果强行使用set foreign_key_checks=0跳过检查并删除主表,子表之后将无法插入任何数据,因为引用关系已不存在。
4. 外键字段的类型和字符集必须与引用的字段完全一致,unsigned属性也需保持一致,否则外键约束无法创建成功。
5. 被引用的列上必须存在索引,这也是创建外键约束的前提条件之一。
外键约束是保证数据引用完整性的重要工具,但使用时需注意诸多细节。从语法到参数,再到实际应用中的各种限制,每一步都值得仔细斟酌。希望本文能帮助您理清外键的使用思路,更好地运用MySQL外键约束。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述