Skip to content

外键约束检查

在 MatrixOne 中,foreign_key_checks 是一个系统变量,用于控制外键约束的检查。这个变量可以是全局的,也可以是会话级别的。当设置为 1(默认值)时,MatrixOne 会检查外键约束的完整性,确保数据的参照完整性。如果设置为 0,则跳过这些检查。

Note

与 MySQL 行为不一致的是,当关闭外键约束检查时,删除父表,MySQL 不会删除子表引用父表的外键关系,但 MatrixOne 会删除子表引用父表的外键关系,重建父表后会重新建立外键关系。

查看 foreign_key_checks

在 MatrixOne 中使用以下命令查看 foreign_key_checks:

--全局模式
SELECT @@global.foreign_key_checks;
SHOW global VARIABLES LIKE 'foreign_key_checks';

--会话模式
SELECT @@session.foreign_key_checks;
SHOW session VARIABLES LIKE 'foreign_key_checks';

设置 foreign_key_checks

在 MatrixOne 中使用以下命令设置 foreign_key_checks:

--全局模式,重新连接数据库生效
set global foreign_key_checks = 'xxx' 

--会话模式
set session foreign_key_checks = 'xxx'

示例

mysql>  SELECT @@session.foreign_key_checks;
+----------------------+
| @@foreign_key_checks |
+----------------------+
| 1                    |
+----------------------+
1 row in set (0.00 sec)

create table t2(a int primary key,b int);
create table t1( b int, constraint `c1` foreign key `fk1` (b) references t2(a));

insert into t2 values(1,2);
mysql> insert into t1 values(3);--开启外键约束检查时,不能插入违反约束的值
ERROR 20101 (HY000): internal error: Cannot add or update a child row: a foreign key constraint fails

mysql> drop table t2;--开启外键约束检查时,不能删除父表
ERROR 20101 (HY000): internal error: can not drop table 't2' referenced by some foreign key constraint

set session foreign_key_checks =0;--关闭外键约束检查
mysql>  SELECT @@session.foreign_key_checks;
+----------------------+
| @@foreign_key_checks |
+----------------------+
| 0                    |
+----------------------+
1 row in set (0.00 sec)

mysql> insert into t1 values(3);--关闭外键约束检查时,可以插入违反约束的值
Query OK, 1 row affected (0.01 sec)

mysql> drop table t2;--关闭外键约束检查时,可以删除父表,
Query OK, 0 rows affected (0.02 sec)

mysql> show create table t1;--删除父表,外键约束也被删除
+-------+--------------------------------------------+
| Table | Create Table                               |
+-------+--------------------------------------------+
| t1    | CREATE TABLE `t1` (
`b` INT DEFAULT NULL
) |
+-------+--------------------------------------------+
1 row in set (0.00 sec)

mysql> create table t2(n1 int);--重建被删除的父表 t2,需包含子表原外键引用列
ERROR 20101 (HY000): internal error: column 'a' no exists in table ''

mysql> create table t2(n1 int,a int primary key);--包含被引用的主键列 a,重建成功
Query OK, 0 rows affected (0.01 sec)

mysql> show create table t1;--重建 t2 后,外键关系会自动重新建立
+-------+-------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                              |
+-------+-------------------------------------------------------------------------------------------------------------------------------------------+
| t1    | CREATE TABLE `t1` (
`b` INT DEFAULT NULL,
CONSTRAINT `c1` FOREIGN KEY (`b`) REFERENCES `t2` (`a`) ON DELETE RESTRICT ON UPDATE RESTRICT
) |
+-------+-------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)