【发布时间】:2012-06-20 17:02:34
【问题描述】:
我目前正在为一个 1452 错误(使用 Symfony2 和教义)而烦恼。
情况如下: 我有 3 张桌子,位置、音乐会和 CD,正如预期的那样,音乐会在某个位置举行,并且 CD 与音乐会相关,其中包括一些外键。
以下是由教义生成的用于创建数据库的 SQL 查询:
CREATE TABLE CD (id INT AUTO_INCREMENT NOT NULL, concert INT NOT NULL, number INT NOT NULL, INDEX IDX_EB3C8BB0D57C02D2 (concert), PRIMARY KEY(id)) ENGINE = InnoDB;
CREATE TABLE Concert (id INT AUTO_INCREMENT NOT NULL, location INT NOT NULL, date DATETIME NOT NULL, name VARCHAR(255) DEFAULT NULL, INDEX IDX_1AC13B4E5E9E89CB (location), PRIMARY KEY(id)) ENGINE = InnoDB;
CREATE TABLE Location (id INT AUTO_INCREMENT NOT NULL, name VARCHAR(40) NOT NULL, city VARCHAR(40) NOT NULL, PRIMARY KEY(id)) ENGINE = InnoDB;
ALTER TABLE CD ADD CONSTRAINT FK_EB3C8BB0D57C02D2 FOREIGN KEY (concert) REFERENCES Concert(id) ON UPDATE CASCADE ON DELETE CASCADE;
ALTER TABLE Concert ADD CONSTRAINT FK_1AC13B4E5E9E89CB FOREIGN KEY (location) REFERENCES Location(id) ON UPDATE CASCADE ON DELETE CASCADE;
事实上,插入 Location 和连接的 Concert 来满足 CD 的外键是没有问题的:
INSERT INTO Location (id, name, city) VALUES (NULL, 'Church', 'Berlin');
INSERT INTO Concert (id, location, date, name) VALUES (NULL, '1', '2012-06-20 19:30:00', NULL);
但是如果我尝试插入一张 CD:
INSERT INTO CD (id ,concert ,number) VALUES (NULL , '1', '1');
我得到了著名的错误:
Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`festival`.`cd`, CONSTRAINT `FK_EB3C8BB0D57C02D2` FOREIGN KEY (`concert`) REFERENCES `Concert` (`id`) ON DELETE CASCADE ON UPDATE CASCADE)
所以我尝试了一些技巧:
-
转义表Location和相关键的创建:
CREATE TABLE CD (id INT AUTO_INCREMENT NOT NULL, concert INT NOT NULL, number INT NOT NULL, INDEX IDX_EB3C8BB0D57C02D2 (concert), PRIMARY KEY(id)) ENGINE = InnoDB; CREATE TABLE Concert (id INT AUTO_INCREMENT NOT NULL, location INT NOT NULL, date DATETIME NOT NULL, name VARCHAR(255) DEFAULT NULL, INDEX IDX_1AC13B4E5E9E89CB (location), PRIMARY KEY(id)) ENGINE = InnoDB; ALTER TABLE CD ADD CONSTRAINT FK_EB3C8BB0D57C02D2 FOREIGN KEY (concert) REFERENCES Concert(id) ON UPDATE CASCADE ON DELETE CASCADE;效果很好。
-
创建后删除表位置(以及相关键):
CREATE TABLE CD (id INT AUTO_INCREMENT NOT NULL, concert INT NOT NULL, number INT NOT NULL, INDEX IDX_EB3C8BB0D57C02D2 (concert), PRIMARY KEY(id)) ENGINE = InnoDB; CREATE TABLE Concert (id INT AUTO_INCREMENT NOT NULL, location INT NOT NULL, date DATETIME NOT NULL, name VARCHAR(255) DEFAULT NULL, INDEX IDX_1AC13B4E5E9E89CB (location), PRIMARY KEY(id)) ENGINE = InnoDB; CREATE TABLE Location (id INT AUTO_INCREMENT NOT NULL, name VARCHAR(40) NOT NULL, city VARCHAR(40) NOT NULL, PRIMARY KEY(id)) ENGINE = InnoDB; ALTER TABLE CD ADD CONSTRAINT FK_EB3C8BB0D57C02D2 FOREIGN KEY (concert) REFERENCES Concert(id) ON UPDATE CASCADE ON DELETE CASCADE; ALTER TABLE Concert ADD CONSTRAINT FK_1AC13B4E5E9E89CB FOREIGN KEY (location) REFERENCES Location(id) ON UPDATE CASCADE ON DELETE CASCADE; ALTER TABLE Concert DROP FOREIGN KEY FK_1AC13B4E5E9E89CB; ALTER TABLE Concert DROP INDEX IDX_1AC13B4E5E9E89CB; DROP TABLE Location;同样的错误。
-
转义外键控制
SET FOREIGN_KEY_CHECKS = 0;同样的错误。
最后两次尝试,让我想到链接 Concert-Location 上的一些索引问题? 你明白,我有点失落。
有人遇到过类似的事情吗?
非常感谢知识,
汤姆。
【问题讨论】:
-
我试图跳过索引,只使用单独的外键。我没有成功,所以我最后的想法是错误的。
-
好的,我已经在另一台 MySQL 服务器上尝试过,它正在工作。我能注意到的唯一区别是我正在运行 MySQL 5.5.9(失败)并且成功的尝试是在 5.1.44
标签: mysql sql macos foreign-keys mamp