mysql禁用参照完整性(mysql disable referential integrity)

我想把所有的模式放在一个mysql数据库中,我不想被引用完整性错误困扰

在h2中它是这样做的

SET REFERENTIAL_INTEGRITY FALSE;
drop table if exists company;
drop table if exists computer;
SET REFERENTIAL_INTEGRITY TRUE;
如何在mysql中实现?
I want to drop all the schemas in a mysql db, and I don't want to be bothered with referential integrity errors
in h2 it's done like this
SET REFERENTIAL_INTEGRITY FALSE;
drop table if exists company;
drop table if exists computer;
SET REFERENTIAL_INTEGRITY TRUE;
How can it be achieved in mysql?
原文:https://stackoverflow.com/questions/9957878
更新时间:2020-01-15 18:11
最满意答案
这应该工作:
SET @@foreign_key_checks = 0;
DROP TABLE IF EXISTS company;
DROP TABLE IF EXISTS computer;
SET @@foreign_key_checks = 1;
This should work:
SET @@foreign_key_checks = 0;
DROP TABLE IF EXISTS company;
DROP TABLE IF EXISTS computer;
SET @@foreign_key_checks = 1;
2012-03-31
相关问答
我提出了一个解决方案,我实际上得益于这个问题的答案: 强制InnoDB重新检查表/表上的外键? 我以前见过这个问题,但最后花了大约20分钟拆开所有抽象包,并试图用具体的术语来理解它在做什么。 实际上,这真的不是那么复杂。 根据我在这个问题中给出的例子来说明解决方案的核心,你基本上有两个SELECT语句: SELECT *
FROM information_schema.KEY_COLUMN_USAGE
WHERE
`CONSTRAINT_SCHEMA` LIKE `test`
AN
...

我想到了一些潜在的选择: 在数据库中设置级联删除,以便删除始终成功。 在删除之前用SELECT检查相关记录。 这要求应用程序了解约束。 一个好的域模型(业务类)应该允许应用程序知道相关记录。 O / R Mapper(如NHibernate)可用于定义级联删除操作。 使用SMO(Microsoft.SqlServer.Smo)检查数据库架构的关系,然后检查现有的相关记录。 我不知道这是否可能。 There are a few potential options that come to mind:

...

这是Rails ActiveRecord的设计决定。 我认为存储过程和约束是卑鄙的和鲁莽的连贯性驱逐者。 不,数据库先生,你不能拥有我的业务逻辑。 你的程序野心将没有结果,你将不得不从我死去的,冷酷的面向对象的手中撬开那种逻辑。 选择一层聪明

- DHH 所以答案是DB处理的引用完整性根本不是Rails方式。 It's a design decision for Rails ActiveRecord. I consider stored procedures and constraints vil
...
这应该工作: SET @@foreign_key_checks = 0;
DROP TABLE IF EXISTS company;
DROP TABLE IF EXISTS computer;
SET @@foreign_key_checks = 1;
This should work: SET @@foreign_key_checks = 0;
DROP TABLE IF EXISTS company;
DROP TABLE IF EXISTS computer;
SET @@for
...
你可以做的最好的是捕获SqlException而不是Exception 。 然后,不要依赖这条消息,你可以通过ErrorCode (547)。 而且,请记住,您可以将异常堆栈并按顺序处理(因此首先放置更具体的捕获代码,您的代码如下所示: try
{
}
catch(SqlException sqlEx)
{
if(sqlEx.ErrorCode == 547)
throw;
}
catch(Exception ex)
{
//General error logic
...

要将一个表中的两个单独关系添加到另一个表中的两个不同的字段中,您需要在关系窗口中拥有多个父表的实例。 因此,您需要将用户和文档表添加到关系窗口并创建第一个关系。 然后再次将用户表添加到关系窗口(它将被别名为Users_1),然后从该别名副本添加第二个关系。 这与您在QBE中定义两个这样的连接的方式完全一致,所以我会说这完全没有问题。 但它不一定明显! To add two individual relationships from one table to two different fields

...

检查SSIS中的引用完整性有三种方法: 在源查询中(如果您可以在源查询中进行正确的连接) 使用一些组件(查找,加入/合并,脚本任务) 让目标报告错误 正如您所说,fastload目标将整批重定向到错误输出。 如果您希望很少发生引用完整性问题,您可能希望: 将错误行重定向到同一个表的另一个目标,但将目标设置为以1行的批量写入 然后将错误行从此新目标重定向到错误表 如果您的目标批量不是太大,这应该可以正常工作,否则,此解决方案可能对您来说很慢。 此外,您可能需要考虑在插入之前关闭检查约束或禁用外键,然

...

假设复制是事务性的,并且您的发布者具有参照完整性,那么任何订阅者都将保持同步,因此将保持参照完整性。 插入顺序是一致的。 Assuming replication is transactional and you have referential integrity on your publisher, then any subscribers will be in sync and therefore referential integrity will be maintained. The o

...

您的交叉路口表根本不应包含计划/合作伙伴名称 ,它应仅包含计划/合作伙伴ID值。 通过在交集表中保留名称的副本,您已经对数据进行了非规范化 。 这通常被认为是“坏事”。 Your intersection table should not include the Program/Partner Names at all, it should only include the Program/Partner ID values. By keeping a copy of the names in t

...

回答 这里有一些代码可以满足您的需求。 看起来没有这样的命令。 历史 好吧,我不是MySQL专家,但除非你禁用它,否则会不断管理参照完整性。 除非先删除或禁用约束,否则不能在违反约束的表中插入行。 没有必要“检查”它们。 如果你“禁用”它们,那么启用它们将强制检查。 事实上,这确实是完全错误的,而且非常可怕。 至少在5.1中 我认为如果他们有这个功能,他们会在你重新启用约束时调用它,所以我怀疑你会在服务器中找到它。 Answer Here is some code which does what

...