Mysql 没有外键约束,需要执行复杂的删除操作

Mysql 没有外键约束,需要执行复杂的删除操作,mysql,database,database-design,foreign-keys,Mysql,Database,Database Design,Foreign Keys,我有一个网站,我一直在努力创造非常迅速,现在正在偿还一些技术债务。我有一个复杂的问题: 我的网站处理徒步旅行的日程安排。一旦你创建了徒步旅行,它就有许多与之相关的东西: 留言板、与会者名单、所属团体、拼车、路线、车头等 下面是一个示例,您可以看到我所说的内容: 我所说的技术债务是,我从来没有在DB中创建外键,现在需要执行级联删除,我不知道如何才能避免引入一百万个bug:) 我现在应该为所有表制作外键吗?我该怎么做 谢谢, Alex在上查看MySQL文档。注意,您需要使用innoDB表 ALTE

我有一个网站,我一直在努力创造非常迅速,现在正在偿还一些技术债务。我有一个复杂的问题:

我的网站处理徒步旅行的日程安排。一旦你创建了徒步旅行,它就有许多与之相关的东西: 留言板、与会者名单、所属团体、拼车、路线、车头等

下面是一个示例,您可以看到我所说的内容:

我所说的技术债务是,我从来没有在DB中创建外键,现在需要执行级联删除,我不知道如何才能避免引入一百万个bug:)

我现在应该为所有表制作外键吗?我该怎么做

谢谢,
Alex

在上查看MySQL文档。注意,您需要使用innoDB表

ALTER TABLE <tablename>
ADD CONSTRAINT <fkname> FOREIGN KEY <index name>(<columns>)
REFERENCES <othertable> (<columns>)
ON DELETE CASCADE
ALTER表
添加约束外键()
参考文献()
关于删除级联

在上查看MySQL文档。注意,您需要使用innoDB表

ALTER TABLE <tablename>
ADD CONSTRAINT <fkname> FOREIGN KEY <index name>(<columns>)
REFERENCES <othertable> (<columns>)
ON DELETE CASCADE
ALTER表
添加约束外键()
参考文献()
关于删除级联

我建议为数据库中的表创建外键。这将是处理您所面临问题的一种更有效的方法。显然,您了解外键对数据库施加的影响,以及如何处理这些键

如果我遇到这个问题,如果我有一个图形界面(例如PhpMyAdmin),我会为数据库使用图形界面,否则快速的谷歌会带来一些问题


编辑:在链接教程中,在多对一关系中,您可以在“多”表上调整键的速度,指示该表中的某列只能具有“一”表中某列中存在的值。大家好,请点击链接查看一个工作示例


向已包含数据的表添加键时,如果某些数据格式不正确,则可能无法添加外键。例如,如果您有一个电话号码表引用一个人表(一个人有多个电话号码),并且您有任何电话号码具有无效的person_id(可能person 5已被删除,但仍然有一个person_id为5的电话号码)在删除有问题的电话号码之前,您将无法创建外键。

我建议为数据库中的表创建外键。这将是处理您所面临问题的一种更有效的方法。显然,您了解外键对数据库施加的影响,以及如何处理这些键

如果我遇到这个问题,如果我有一个图形界面(例如PhpMyAdmin),我会为数据库使用图形界面,否则快速的谷歌会带来一些问题


编辑:在链接教程中,在多对一关系中,您可以在“多”表上调整键的速度,指示该表中的某列只能具有“一”表中某列中存在的值。大家好,请点击链接查看一个工作示例


向已包含数据的表添加键时,如果某些数据格式不正确,则可能无法添加外键。例如,如果您有一个电话号码表引用一个人表(一个人有多个电话号码),并且您有任何电话号码具有无效的person_id(可能person 5已被删除,但仍然有一个person_id为5的电话号码)在删除有问题的电话号码之前,您将无法创建外键。

如果您没有制作正式外键,您是否以其他方式制作了外键,以允许链接表,或者所有表都不相关

如果仍然需要关联这些表,那么您只需编写一个级联删除代码

否则,很可能是重新设计或添加foreignkey乐趣


如果您还没有获得MySQL工作台的副本,并从中重新设计它,添加外键。这也将为您生成SQL代码。

如果您没有生成正式的外键,那么您是否以其他方式生成了键以允许链接表,或者所有表都不相关

如果仍然需要关联这些表,那么您只需编写一个级联删除代码

否则,很可能是重新设计或添加foreignkey乐趣


如果您还没有获得MySQL工作台的副本,并从中重新设计它,添加外键。这也将为您生成SQL代码。

我也会创建外键,但如果有任何原因阻止您这样做,那么还有另一种解决方案,即创建触发器。当数据库中的表发生更新、删除或插入(包括更改其他表中的其他元组)时,您可以告诉触发器基本上执行任何您想要的操作。以下是有关如何创建触发器的两个教程:

http://msdn.microsoft.com/en-us/library/ms189799.aspx

第一个看起来更直接、更清晰,但如果它们都没有帮助,只需在谷歌上搜索DB触发器,就可以了


我希望这有帮助:)

我也会去创建外键,但如果有任何原因阻止您这样做,还有另一种解决方案,那就是创建触发器。当数据库中的表发生更新、删除或插入(包括更改其他表中的其他元组)时,您可以告诉触发器基本上执行任何您想要的操作。以下是有关如何创建触发器的两个教程:

http://msdn.microsoft.com/en-us/library/ms189799.aspx

第一个看起来更直接、更清晰,但如果它们都没有帮助,只需在谷歌上搜索DB触发器,就可以了


我希望这有帮助:)

实际上,什么是innoDB?我一直在这里和那里看到弹出窗口,但不确定它到底是什么:)InnoDB是MySQL的替代存储引擎-默认的存储引擎是“快速脏”。InnoDB支持事务、外键等-对于某些操作来说,它稍微慢一些,但是