代码之家  ›  专栏  ›  技术社区  ›  Gnuffo1

MySQL IDNODB?当数据已经存在时,它会产生级联外键约束?

  •  1
  • Gnuffo1  · 技术社区  · 15 年前

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

    1452 - Cannot add or update a child row: a foreign key constraint fails 
    (`database`.`#sql-1358_38d`, CONSTRAINT `#sql-1358_38d_ibfk_1` FOREIGN KEY 
    (`manufacturerID`) REFERENCES `manufacturer` (`ID`) ON DE)
    

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

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

    ALTER TABLE part_number ADD CONSTRAINT
    FOREIGN KEY(manufacturerID)
    REFERENCES manufacturer(ID)
    ON DELETE CASCADE
    ON UPDATE CASCADE;
    
    2 回复  |  直到 15 年前
        1
  •  2
  •   Stephen    15 年前

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

    SELECT part_number.id FROM part_number LEFT JOIN manufacturer ON (manufacturer.ID = part_number.manufacturerID) where manufacturer.ID IS NULL

        2
  •  1
  •   Community Mohan Dere    9 年前

    你可以用两种方法。

    1使用不存在()

    DELETE FROM part_number
     WHERE NOT EXISTS (
               select id from manufacturer
                where part_number.manufacturerID = manufacturer.ID
           )
    

    2。使用临时表(有点难看,但我也会张贴)

    -- 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`;
    

    请看我的相关问题: Handling database integrity

    希望这对你有用:)