繁体   English   中英

如何调试mysql外键约束,ON DELETE CASCADE不能在生产环境中从子表中删除行

[英]How to debug mysql foreign key constraint, ON DELETE CASCADE not deleting rows from Child table on production environment

我已经定义了2个表和它们之间的前键约束,如下所示:

| users | CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `account_master_id` int(11) NOT NULL,
  `user_type_id` int(11) NOT NULL,
  `user_group_id` int(11) NOT NULL,
  `user_type_code` char(1) NOT NULL,
  `membership_number` varchar(40) NOT NULL,
  `password` varchar(60) NOT NULL,
  `email` varchar(200) NOT NULL,
  `isd` varchar(10) NOT NULL,
  `mobile` varchar(20) NOT NULL,
  `passenger_id` int(11) NOT NULL,
  `added_on` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_on` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `added_by` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `email` (`email`),
  KEY `account_master_id` (`account_master_id`),
  CONSTRAINT `acMaster_to_user` FOREIGN KEY (`account_master_id`) REFERENCES `account_master` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=189 DEFAULT CHARSET=utf8 |


user_oauth | CREATE TABLE `user_oauth` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `service` varchar(30) NOT NULL,
  `auth_id` varchar(100) NOT NULL,
  `email` varchar(100) NOT NULL,
  `auto_share` tinyint(4) NOT NULL,
  `photo` varchar(255) NOT NULL,
  `auth_token_short` varchar(255) DEFAULT NULL,
  `auth_details` text NOT NULL,
  `device_type` varchar(60) NOT NULL,
  `login_date` datetime NOT NULL,
  `login_ip` varchar(20) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `user` (`user_id`),
  CONSTRAINT `user_to_oauth` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=109 DEFAULT CHARSET=latin1 |

在从用户表删除行时,在本地和登台环境中从user_oauth表中删除相应的条目。 但是,在PRODUCTION环境中,同样的事情不起作用。 我想知道我该如何调试。

更新:

  • 两个表都是innodb
  • 在严格模式下运行mysql

外键可能不起作用的原因是:

  • 不支持它们(例如,在MyISAM表上)
  • 他们被禁用

MySQL允许您通过将系统变量foreign_key_checks设置为0来禁用外键约束 这将允许您违反所有外键约束(例如,删除父项或添加无父项的子项)。 但是,这反过来又会禁用相关的功能,例如级联,这些功能可以自动防止特定的约束冲突(例如,通过删除子级)-如果禁用该选项,当然不会再发生这种情况。

这个想法是为了帮助您完成一些管理任务,例如,当引用的数据尚不存在时导入数据,但通常不应在正常操作期间使用它。 如果再次出现该设置,则可能要检查您的应用程序是否偶然设置了此选项,因为默认情况下,每台服务器启动后就会启用该选项,并且必须明确禁用它。

您可以通过以下方式检查当前设置:

select @@foreign_key_checks;

您可以使用

SET foreign_key_checks = 1;

再次启用它,但是请注意它将不会检查您的当前数据:

将foreign_key_checks设置为1不会触发对现有表数据的扫描。 因此,将不会验证foreign_key_checks = 0时添加到表中的行的一致性。

因此,您必须自己检查并修复它。 您可以在启用该设置之前或之后进行此操作,尽管之前进行设置可能会更容易。 要触发重新检查,您可以并且应该删除并重新创建外键,只是为了确保现在一切都一致。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM