如何在MySQL上使用外键支持销毁父对象?

时间:2015-05-25 11:27:25

标签: mysql ruby-on-rails

自Rails 4.2以来,外键支持显示,自动将add_foreign_key添加到迁移文件。

但是使用MySql,在销毁父对象时,会发生以下错误。

user.destroy
   (0.2ms)  BEGIN
  Authentication Load (0.5ms)  SELECT `authentications`.* FROM `authentications` WHERE `authentications`.`user_id` = 5
  SQL (2.3ms)  DELETE FROM `authentications` WHERE `authentications`.`id` = 4
  Twitter Load (3.2ms)  SELECT  `twitters`.* FROM `twitters` WHERE `twitters`.`id` = 3 LIMIT 1
  SQL (1.7ms)  DELETE FROM `twitters` WHERE `twitters`.`id` = 3
  Follow Load (0.3ms)  SELECT `follows`.* FROM `follows` WHERE `follows`.`user_id` = 5
  Activity Load (0.4ms)  SELECT  `activities`.* FROM `activities` WHERE `activities`.`trackable_id` = 16 AND `activities`.`trackable_type` = 'Follow' LIMIT 1
  Feed Load (1.0ms)  SELECT `feeds`.* FROM `feeds` WHERE `feeds`.`activity_id` = 40
  Notification Load (0.4ms)  SELECT `notifications`.* FROM `notifications` WHERE `notifications`.`activity_id` = 40
  SQL (0.3ms)  DELETE FROM `notifications` WHERE `notifications`.`id` = 24
  SQL (1.8ms)  DELETE FROM `activities` WHERE `activities`.`id` = 40
  SQL (0.7ms)  DELETE FROM `follows` WHERE `follows`.`id` = 16
  Follow Load (0.4ms)  SELECT `follows`.* FROM `follows` WHERE `follows`.`followed_id` = 5
  SQL (11.2ms)  DELETE FROM `users` WHERE `users`.`id` = 5
Mysql2::Error: Cannot delete or update a parent row: a foreign key constraint fails (`inq_development`.`notifications`, CONSTRAINT `fk_rails_c3860515c7` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`)): DELETE FROM `users` WHERE `users`.`id` = 5
   (0.5ms)  ROLLBACK
ActiveRecord::StatementInvalid: Mysql2::Error: Cannot delete or update a parent row: a foreign key constraint fails (`inq_development`.`notifications`, CONSTRAINT `fk_rails_c3860515c7` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`)): DELETE FROM `users` WHERE `users`.`id` = 5
from /Users/araky/git/inq_rails/vendor/bundle/ruby/2.1.0/gems/activerecord-4.2.0/lib/active_record/connection_adapters/abstract_mysql_adapter.rb:299:in `query'

上面,我试图销毁有许多其他对象的用户。 我想如果我们尝试在单个事务上同时删除父行和子行,MySQL会引发错误。 (我听说PostgreSQL正确处理这些情况。)

如何破坏父行? 我们要删除外国约束?或禁用子模型中设置的相关选项?

什么是最佳做法?

0 个答案:

没有答案