PHP PDO - MySQL查询创建或更新(唯一索引)

时间:2014-03-18 12:32:13

标签: php mysql pdo

希望你顺利。

我在MySQL(MariaDB)数据库中有一个表,其中包含以下架构:

CREATE TABLE `scheduled_immobilise` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `account` varchar(32) COLLATE utf8_unicode_ci DEFAULT NULL,
  `device` varchar(32) COLLATE utf8_unicode_ci DEFAULT NULL,
  `allow_from` time DEFAULT NULL,
  `allow_to` time DEFAULT NULL,
  `active` varchar(6) COLLATE utf8_unicode_ci DEFAULT NULL,
  `last_updated` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
  `cron_id_from` int(11) DEFAULT NULL,
  `cron_id_to` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `unique` (`account`,`device`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

我要做的是编写一个查询,该查询将创建一行(如果唯一索引不存在),或者如果它已经存在则更新它。我知道你可以先做一个选择查询来做到这一点,但最终我希望避免这种情况。下面是我用来创建的SQL查询。请注意,这是使用PDO命名的占位符..

INSERT INTO 
    scheduled_immobilise (
        account, 
        device, 
        allow_from, 
        allow_to, 
        active
    ) 
VALUES (
    :account, 
    :device, 
    :allow_from, 
    :allow_to,
    :active
)

非常感谢任何帮助,提前谢谢!

保罗。

2 个答案:

答案 0 :(得分:6)

这个

的确有一个mysql选项
INSERT INTO 
scheduled_immobilise (
    account, 
    device, 
    allow_from, 
        allow_to, 
        active
    ) 
VALUES (
    :account, 
    :device, 
    :allow_from, 
    :allow_to,
    :active
)
ON DUPLICATE KEY UPDATE account = :account, device = device...etc

答案 1 :(得分:1)

稍微更正确的答案

INSERT INTO 
scheduled_immobilise (
    account, 
    device, 
    allow_from, 
        allow_to, 
        active
    ) 
VALUES (
    :account, 
    :device, 
    :allow_from, 
    :allow_to,
    :active
)
ON DUPLICATE KEY UPDATE 
    account = values(account), 
    device = values(device)
    ...etc

它允许您使用任何类型的占位符,在任何模式下以及PDO旁边的任何驱动程序,而其他答案仅在PDO的仿真模式打开时才有效。