Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL InnoDB-当已经存在违反它的数据时创建级联外键约束?_Mysql_Foreign Keys_Innodb - Fatal编程技术网

MySQL InnoDB-当已经存在违反它的数据时创建级联外键约束?

MySQL InnoDB-当已经存在违反它的数据时创建级联外键约束?,mysql,foreign-keys,innodb,Mysql,Foreign Keys,Innodb,我有一个最初在MyISAM中的数据库,因此没有外键约束。因此,有相当多的孤立行,其中外键引用的记录已被删除 为了解决这个问题,我决定转换为InnoDB并添加外键,同时使用CASCADE进行更新和删除。但是,当我尝试添加外键时,会出现如下错误(从Navicat 8控制台): 我知道它为什么这样做——因为孤立的行。有没有办法让约束的创建自动清除这些行?浏览所有表并找到孤立行需要花费很多时间 这是我正在运行的查询之一,以防怀疑: ALTER TABLE part_number ADD CONSTRAI

我有一个最初在MyISAM中的数据库,因此没有外键约束。因此,有相当多的孤立行,其中外键引用的记录已被删除

为了解决这个问题,我决定转换为InnoDB并添加外键,同时使用CASCADE进行更新和删除。但是,当我尝试添加外键时,会出现如下错误(从Navicat 8控制台):

我知道它为什么这样做——因为孤立的行。有没有办法让约束的创建自动清除这些行?浏览所有表并找到孤立行需要花费很多时间

这是我正在运行的查询之一,以防怀疑:

ALTER TABLE part_number ADD CONSTRAINT
FOREIGN KEY(manufacturerID)
REFERENCES manufacturer(ID)
ON DELETE CASCADE
ON UPDATE CASCADE;

编写一个查找孤立行的查询,然后使用该查询进行删除。e、 g


从part\u number LEFT JOIN manufacturer ON(manufacturer.id=part\u number.manufacturerID)中选择part\u number.id,其中manufacturer.id为空

您需要清除所有不相关的记录,然后才能添加约束

你可以用两种方法

1使用不存在() 2.使用临时表(有点难看,但我也会发布) 见我的相关问题:

删除所有“死”记录后,您将能够添加约束


希望这对你有用:)

这基本上就是我开始做的,但这需要一段时间,只是想知道是否有能力不必手动完成。
ALTER TABLE part_number ADD CONSTRAINT
FOREIGN KEY(manufacturerID)
REFERENCES manufacturer(ID)
ON DELETE CASCADE
ON UPDATE CASCADE;
DELETE FROM part_number
 WHERE NOT EXISTS (
           select id from manufacturer
            where part_number.manufacturerID = manufacturer.ID
       )
-- create a temporary table
CREATE TEMPORARY TABLE `temp_ids`
(
  `id` INTEGER
);

-- store all id's that need to be deleted
INSERT INTO `temp_ids`
SELECT part_number.id FROM part_number LEFT JOIN manufacturer ON (manufacturer.ID = part_number.manufacturerID)
WHERE ISNULL(`manufacturer.ID);

-- delete them
DELETE
FROM part_number
WHERE id IN (
  SELECT `id` FROM `temp_ids`
);

-- drop the table
DROP TEMPORARY TABLE `temp_ids`;