Mysql Doctrine2外键失败

时间:2012-09-19 20:19:48

标签: mysql doctrine-orm

您已经设置了一个包含表States和StoreLocations的数据库。我为两者创建了实体。以及RESTful服务。在我的本地机器上发布新位置时,一切正常。

我已将我的项目部署到另一台服务器,当我尝试在此计算机上发布新位置时,我收到以下错误

Code: 23000 
Message: SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`vitanica`.`StoreLocation`, CONSTRAINT `storelocation_ibfk_1` FOREIGN KEY (`state_id`) REFERENCES `state` (`id`))
File: /home/audioglobe.com/zend/vendor/doctrine/dbal/lib/Doctrine/DBAL/Statement.php
Line: 131 

我不明白为什么这会在一台机器而不是另一台机器上运行。提前感谢您对此问题的任何想法!

以下是我的表格:

mysql> show create table StoreLocation

| StoreLocation | CREATE TABLE `StoreLocation` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(60) DEFAULT NULL,
`address` varchar(80) DEFAULT NULL,
`city` varchar(80) DEFAULT NULL,
`state_id` int(11) DEFAULT NULL,
`zip` varchar(12) DEFAULT NULL,
`phone` varchar(20) DEFAULT NULL,
`lat` float(10,6) DEFAULT NULL,
`lng` float(10,6) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `state` (`state_id`),
CONSTRAINT `storelocation_ibfk_1` FOREIGN KEY (`state_id`) REFERENCES `state` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=latin1 |

mysql> show create table State

| State | CREATE TABLE `State` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`code` varchar(10) NOT NULL,
`state` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=51 DEFAULT CHARSET=latin1 |

来自我的实体的片段:

/** @Entity */ 
class State
{
  ....
    /** @OneToMany(targetEntity="StoreLocation", mappedBy="state") */
    private $stores;
}

/** @Entity @HasLifecycleCallbacks*/
class StoreLocation
{
    /**
    * @ManyToOne(targetEntity="State", inversedBy="id")
    */
    private $state;
}

2 个答案:

答案 0 :(得分:3)

似乎fk失败了,因为mysql在生产时是区分大小写的。表名为State,但约束为state(id)。我将所有表名更改为小写,并将属性@Table('state')添加到我的实体。现在一切都按预期工作了!谢谢你的帮助!

答案 1 :(得分:0)

约束的要点是,在StoreLocation内,您不能拥有state_id表中不存在的State

您是否已使用完整的状态列表填充了State表格?