【发布时间】:2011-12-04 00:46:06
【问题描述】:
我在 Symfony2 实体关系方面迈出了第一步。 我有一个实体安装,每个都有一个仪表和一个监视器。
这转化为单向关系,我将其定义为:
/**
*
* @ORM\OneToOne(targetEntity="InfoMeter")
* @ORM\JoinColumn(name="meterid", referencedColumnName="id")
*/
private $meter;
/**
*
* @ORM\OneToOne(targetEntity="InstallationsRtu")
* @ORM\JoinColumn(name="monitorid", referencedColumnName="id")
*/
private $monitor;
每台显示器只能分配给一个安装。 每个仪表可以分配到多个安装。
当我更新我的数据库(应用程序/控制台原则:模式:更新 --force)时,有两种结果。
如果是显示器:
一切正常,架构更新为带有前缀 'UNIQ_' 的键名。
如果是仪表: 我收到以下错误
PDOException]
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '1' for key 'UNIQ_43D26968860BE41D'
当我在发生此错误后查看表结构时,我找不到提到的约束,但我确实找到了 FK_43D26968860BE41D,即相同,但前缀为“FK”。
在安装表中,我现在列出了这些:
Keyname Type Unique Packed Field Cardinality
PRIMARY BTREE Yes No id 2
UNIQ_43D26968701EC1AB BTREE Yes No monitorid 2
FK_43D26968860BE41D BTREE No No meterid 2
所以一个说“唯一=是”,另一个说“唯一=否”。
回答我的问题:
如何确定它是 UNIQ 索引还是 FK 索引?
我假设 Doctrine 看到当前每个 monitorid 在安装表中都是唯一的,但每个meterid 在安装表中出现多次。
因此它与UNIQ一起用于第一个,FK用于后者。但我能以某种方式控制它吗?
【问题讨论】:
-
这里完全是一个愚蠢的错误,是由于对 OneToOne 和 OneToMany 不清楚造成的。不过,为了以后的菜鸟,我要把它留在这里;)
标签: foreign-keys doctrine-orm symfony entity-relationship unique-index