Mysql 不寻常的1452错误与学说

Mysql 不寻常的1452错误与学说,mysql,sql,macos,foreign-keys,mamp,Mysql,Sql,Macos,Foreign Keys,Mamp,我目前正在为一个1452错误(将Symfony2与条令一起使用)绞尽脑汁 情况如下: 我有3张桌子,地点,音乐会和CD,正如预期的那样,音乐会在某个地点举行,CD与音乐会相关,包括一些外键 以下是doctrine为创建数据库而生成的SQL查询: CREATE TABLE CD (id INT AUTO_INCREMENT NOT NULL, concert INT NOT NULL, number INT NOT NULL, INDEX IDX_EB3C8BB0D57C02D2 (concert

我目前正在为一个1452错误(将Symfony2与条令一起使用)绞尽脑汁

情况如下: 我有3张桌子,地点,音乐会和CD,正如预期的那样,音乐会在某个地点举行,CD与音乐会相关,包括一些外键

以下是doctrine为创建数据库而生成的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;
事实上,插入位置和连接的音乐会以满足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)
所以我尝试了一些技巧:

  • 转义表位置和相关键的创建:

    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;
    
    同样的错误

  • 最后两次尝试,让我想到了一些关于链接音乐会位置的索引问题? 你知道,我有点迷路了

    有没有人已经面临过类似的问题

    非常感谢你的知识

    汤姆。所以

    据介绍,自OSX上的5.5.9以来,MySQL服务器在使用外键插入时失败。这个bug似乎具有大小写敏感性

    有多种方法可以解决此问题(此列表并非详尽无遗,某些选项可能无效):

    • 仅使用小写的表名
    • 尝试设置为O或1(但在OSX上,这并不总是可能导致系统区分大小写)
    • 降级到MySQL服务器5.5.8(我还没有测试过升级)

    .

    我尝试跳过索引,只使用外键。我没有成功,所以我上一个想法是错误的。好吧,我已经在另一台MySQL服务器上尝试过了,它正在工作。我能注意到的唯一区别是,我运行的是MySQL 5.5.9(失败),成功的尝试是在5.1.44上