繁体   English   中英

如何在不删除表的情况下更改外键引用 DELETE CASCADE

[英]How to alter Foreign Key reference ON DELETE CASCADE without dropping table

我创建了带有外键引用的数据库表ON UPDATE CASCADE ON DELETE RESTRICT 但是,我设置了我的引擎 MyISAM,所以这个引用不起作用。 即使主键在其他地方用作外键,也会被删除。 我该如何解决这个问题? 我试图将表引擎更改为 InnoDB,但即使将其设置为 InnoDB,外部引用也不起作用。 此外,我试图删除一个带有外键引用和引擎 MyISAM 的空表。 然后我尝试添加该表,但它没有添加。 很可能当我删除表时,外部引用仍保留在模式中的某处。

我的查询创建表。

CREATE TABLE IF NOT EXISTS `products` (
    `productid` int(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    `productname` varchar(255) NOT NULL,
    `productcode` varchar(255) NOT NULL,
    `producttype` varchar(255) NULL
) 
ENGINE=MyISAM DEFAULT CHARSET=utf8;

CREATE TABLE IF NOT EXISTS `sales` (
    `salesid` int(10) NOT NULL AUTO_INCREMENT PRIMARY KEY
    `productid` int(10) NOT NULL,
    `quantity` int(10) NOT NULL,
    `price` int(10) NOT NULL,
    `date` datetime NOT NULL,
    CONSTRAINT `fk_sales_productid` 
    FOREIGN KEY (productid) 
    REFERENCES products(productid) ON UPDATE CASCADE ON DELETE RESTRICT
) 
ENGINE=MyISAM DEFAULT CHARSET=utf8;

这 2 个表是使用此查询作为 MyISAM 创建的。 他们有我需要的数据。 我运行此查询以将引擎更改为 InnoDB,因为删除级联的参考在 MyISAM 中不起作用。 'ALTER TABLE products ENGINE=InnoDB;' 'ALTER TABLE sales ENGINE=InnoDB;' 但是制作InnoDB后,删除产品时引用仍然不起作用,销售表中的相关产品ID变为NULL。

根据 P.Salmon 的演示查询似乎有效。 您可能在 FK 参考资料中遗漏了一些东西。 我建议您导出 2 个表,在编辑器中检查它,尤其是 FK 引用部分并确保引擎是 InnoDB,因为它具有行级锁定并且具有涉及支持外键和关系约束的所谓的参照完整性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM