SQL:Insert..ON DUPLICATE KEY无效

时间:2017-10-26 14:18:01

标签: php mysql sql pdo insert

我在PHP中的查询是:

$upd2 = $di->getDb()->prepare('INSERT INTO '. self::TABLE . '_agrupamento_avaliacao (idSemana, idEntidade_agrupamento) VALUES(?, ?) ON DUPLICATE KEY UPDATE idEntidade_agrupamento=VALUES(idEntidade_agrupamento)');
$upd2->Execute(array($semana, $agrupamento));

但它不起作用。它正在插入相同的数据。 我测试了查询:

INSERT INTO entidade_agrupamento_avaliacao (idSemana, idEntidade_agrupamento) VALUES(17, 2808) ON DUPLICATE KEY UPDATE idEntidade_agrupamento=VALUES(idEntidade_agrupamento)

但它也插入相同的数据而不是更新数据。

我的表是:

CREATE TABLE `entidade_agrupamento_avaliacao` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`idSemana` INT(10) UNSIGNED NOT NULL,
`idEntidade_Agrupamento` INT(10) UNSIGNED NOT NULL,
PRIMARY KEY (`id`),
INDEX `FK__semana` (`idSemana`),
INDEX `FK_entidade_agrupamento_avaliacao_entidade_agrupamento` (`idEntidade_Agrupamento`),
CONSTRAINT `FK__semana` FOREIGN KEY (`idSemana`) REFERENCES `semana` (`id`) ON UPDATE CASCADE ON DELETE CASCADE,
CONSTRAINT `FK_entidade_agrupamento_avaliacao_entidade_agrupamento` FOREIGN KEY (`idEntidade_Agrupamento`) REFERENCES `entidade_agrupamento` (`id`) ON UPDATE CASCADE ON DELETE CASCADE
)COLLATE='latin1_swedish_ci'
ENGINE=InnoDB
AUTO_INCREMENT=4
;

有什么问题?

考虑“$ di-> getDb() - >准备”作为PDO声明准备。

1 个答案:

答案 0 :(得分:3)

这是您的查询:

INSERT INTO '. self::TABLE . '_agrupamento_avaliacao (idSemana, idEntidade_agrupamento)
    VALUES(?, ?)
    ON DUPLICATE KEY UPDATE idEntidade_agrupamento = VALUES(idEntidade_agrupamento)');

您在表上唯一唯一的索引是id上的主键。这是自动递增的,因此不会生成重复。

据推测,您希望将idSemana声明为唯一。然后可以捕获重复的密钥。您可能认为index idSemana足以达到此目的,但您确实需要unique idSemana