Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP PDO-MySQL查询创建或更新(唯一索引)_Php_Mysql_Pdo - Fatal编程技术网

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

PHP PDO-MySQL查询创建或更新(唯一索引),php,mysql,pdo,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_

希望你身体健康

我在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;
我试图做的是编写一个查询,该查询将创建一行(如果唯一索引不存在),或者如果它已经存在,则更新它。我知道您可以通过先执行select查询来实现这一点,但最终我希望避免这种情况。下面是我用来创建的SQL查询。请注意,这是使用PDO命名占位符

INSERT INTO 
    scheduled_immobilise (
        account, 
        device, 
        allow_from, 
        allow_to, 
        active
    ) 
VALUES (
    :account, 
    :device, 
    :allow_from, 
    :allow_to,
    :active
)
非常感谢您的帮助,提前谢谢


Paul.

这正是一个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

略为正确的答案

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的仿真模式打开时才有效。

“插入…在重复密钥更新时”有关更有效的信息,我认为这是类似的,但我在搜索时发现了混合结果。您知道是否有任何方法可以通过PDO判断它是否创建了新记录或更新了记录?仅供参考,不要期望在所有情况下都能够重用这样的命名参数。我的环境不允许这样做,并且状态
您不能在准备好的语句中两次使用相同名称的命名参数标记
@PatrickQ我确实读过一些关于这方面的内容,但是我已经做了很多次,它对我有效,尽管我不确定它的最佳实践是否。。。