我在本地计算机上创建了数据库。将我的项目移动到服务器后,我从本地导入备份(因为那里有一些重要的数据)。
现在,当我尝试更新服务器上的架构时,它会给出我的输出:
php app/console doctrine:schema:update --force
Updating database schema...
[Doctrine\DBAL\Exception\ForeignKeyConstraintViolationException]
An exception occurred while executing 'ALTER TABLE golf_course ADD CONSTRAINT FK_EC96E162F1503E2B FOREIGN KEY (golf_id) REFERENCES golf (id)':
SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`GolfFairway`.`#sql-3fae_7ccf1`, CONSTRAINT `FK_EC9
6E162F1503E2B` FOREIGN KEY (`golf_id`) REFERENCES `golf` (`id`))
[Doctrine\DBAL\Driver\PDOException]
SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`GolfFairway`.`#sql-3fae_7ccf1`, CONSTRAINT `FK_EC9
6E162F1503E2B` FOREIGN KEY (`golf_id`) REFERENCES `golf` (`id`))
[PDOException]
SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`GolfFairway`.`#sql-3fae_7ccf1`, CONSTRAINT `FK_EC9
6E162F1503E2B` FOREIGN KEY (`golf_id`) REFERENCES `golf` (`id`))
为什么会这样?有解决方案吗?
答案 0 :(得分:26)
@maxian
迈克尔维伦纽夫的回答并不完全正确。如果是生产环境或类型,您只能放弃架构并重新创建它。在当前架构上执行它的唯一方法是:
我不能保证你不会丢失一些钥匙,但你根本不丢弃你的数据。
答案 1 :(得分:9)
您的问题是您要修改具有现有约束的表。我看到两个解决方案:
如果您在开发中,则可以重建数据库
doctrine:database:drop --force
doctrine:database:create
doctrine:schema:create
如果你正在制作,那就有点复杂了。
我看到的一个解决方案是,您可以创建一个命令来保存数据,删除要更改的表中的数据,修改架构,在更改表后重新加载数据。根据变化,不应超过2-3小时。只要确保你有一个备份,以防你的命令向南。
答案 2 :(得分:7)
如果由于外键约束而导致Doctrine架构更新失败,您只需要为此特定更新禁用外键检查。
作为一个单行程,你可以运行:
mysql -e "set foreign_key_checks = 0; `app/console doctrine:schema:update --dump-sql`"
这会将set foreign_key_checks = 0;
添加到app/console doctrine:schema:update --dump-sql
的输出之前,因此它实际上会调用Doctrine会调用的内容,但禁用外键检查。根据您的需要配置mysql
电话。
您的架构已更新,并且根据您的更改,不会丢失任何数据。
请注意,有时查询的顺序很重要,而且Doctrine根本没有对它们进行排序。在这种情况下,您必须由您自己正确地排序查询,然后使用该有序查询列表。
答案 3 :(得分:0)
您需要在新表中添加与该字段相关的值。
例如:如果您有表A和B,并且B是键A(a_id),则需要在A中添加id = 1的字段,并且在表B中需要将a_id更改为来自A表的值-在这种情况下为1(在所有字段中均使用此值)。
运行之后: php app / console原则:schema:update --force
致谢
答案 4 :(得分:-1)
对我来说,它使用了以下设置(有两个关系)。诀窍是不要混淆mappedBy
和inversedBy
。
/**
* @ORM\Entity
* @ORM\Table(name="user")
*/
class User extends BaseUser
{
/**
* @var Merchant
*
* @ORM\OneToOne(targetEntity="Merchant", mappedBy="user")
*/
protected $merchant;
/**
* @var Client
*
* @ORM\OneToOne(targetEntity="Client", mappedBy="user")
*/
protected $client;
}
/**
* @ORM\Table(name="merchant")
* @ORM\Entity
*/
class Merchant extends BaseEntity
{
/**
* @ORM\OneToOne(targetEntity="User", inversedBy="merchant")
*/
protected $user;
}
/**
* @ORM\Table(name="client")
* @ORM\Entity
*/
class Client extends BaseEntity
{
/**
* @ORM\OneToOne(targetEntity="User", inversedBy="client")
*/
protected $user;
}