在我们的数据库中,我们有的表没有单个自动增量主键,而是一个复合主键,可能包含也可能不包含自动增量字段作为该主键的第一个字段。
例如:
DROP TABLE IF EXISTS `gen_5_23`;
CREATE TABLE IF NOT EXISTS `gen_5_23` (
`id_azienda` int(10) unsigned NULL DEFAULT 1,
`id_sede` int(10) unsigned NULL DEFAULT 1,
`revisione_documento` int(10) unsigned NULL DEFAULT 0,
`premessa_generale` text,
`flag_stampa` char(1) DEFAULT 'N',
PRIMARY KEY (`id_azienda`,`id_sede`,`revisione_documento`),
CONSTRAINT `fk_revisione_documento_gen_5_23` FOREIGN KEY (`revisione_documento`, `id_azienda`, `id_sede`) REFERENCES `agews_revisioni_documenti` (`revisione_documento`, `id_azienda`, `id_sede`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS `gen_5_23_consumi`;
CREATE TABLE IF NOT EXISTS `gen_5_23_consumi` (
`id_consumo` int(10) unsigned AUTO_INCREMENT,
`id_azienda` int(10) unsigned NULL DEFAULT 1,
`id_sede` int(10) unsigned NULL DEFAULT 1,
`revisione_documento` int(10) unsigned NULL DEFAULT 0,
`consumo` varchar(255) NULL DEFAULT NULL,
`unita` varchar(255) NULL DEFAULT NULL,
`valore` float(11,2) NULL DEFAULT 0,
PRIMARY KEY (id_consumo,`id_azienda`,`id_sede`,`revisione_documento`),
CONSTRAINT `fk_main_gen_5_23_consumi` FOREIGN KEY (`id_azienda`, `id_sede`, `revisione_documento`) REFERENCES `gen_5_23` (`id_azienda`, `id_sede`, `revisione_documento`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
gen_5_23_consumi中的键被定义为'因为我们的webapp中有一些程序会盲目地占用一行,只更改id_azienda或id_sede或revisione_documento然后重新插入它,这样行就有效了,如如果主键只是id_consumo则不会。
我们正在考虑开始使用doctrine 2进行数据库管理,但我不明白如果有可能,你会如何实现这样一个实体。
答案 0 :(得分:3)
这是可能的但不是开箱即用的。您可以将组合键作为实体的主键:http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/tutorials/composite-primary-keys.html但由于
,应在代码中执行自动增量实现具有复合键的每个实体都不能使用其他id生成器 比“分配”。这意味着ID字段必须具有其值 在调用EntityManager#persist($ entity)。
之前设置
要模拟自动增量行为,您可以使用id作为自动增量PK的序列表,并为此表创建实体。添加从主实体到表示自动增量序列的实体的关系,请参阅上面页面中的类ArticleAttribute,您的代码应该非常相似:
Class Gen523consumiAuto
{
/** @Id @Column(type="integer") @GeneratedValue */
private $id;
}
Class Gen523consumi
{
/** @Id @OneToOne(targetEntity="Gen523consumiAuto") */
private $idConsumo;
/** @Id @Column(type="integer") */
private $idAzienda;
/** @Id @Column(type="integer") */
private $idSede;
/** @Id @Column(type="integer") */
private $revisioneDocumento;
}
答案 1 :(得分:0)
截至目前,您无法使用AUTO INCREMENT选项执行复合(主要,外部)键。
您必须使用自己的代码从表格中选择MAX Key。
然后在您的实体ID上设置MAX + 1。