为什么 ON DUPLICATE KEY 没有按预期工作?

Bon*_*nxy 2 mysql phpmyadmin php

在开始之前,我不是专业的 Web 开发人员。我是使用 google 和StackOverflow自学的。

所以我最近将我的网站从共享主机转移到了 VPS。

我的提供商将我的网站/文件移至我的新主机。两者都运行 cPanel。

我有一个脚本,它在我的旧主机上运行得非常好-

INSERT INTO `database`.`table`
    (`UUID`, `UpdateDate`, `JoinDate`) 
VALUES 
    ('$uuid',NOW(),NOW())
ON DUPLICATE KEY UPDATE
   `UpdateDate` = NOW()
Run Code Online (Sandbox Code Playgroud)

问题是它在我的新服务器上不再起作用。

我认为的问题是它没有更新或插入,因为没有更新该表中的所有列。

我创建了两个测试表,表 A 包含上面 UUID、UpdateDate、JoinDate 中的 3 列,第二个表 B 包含 UUID、用户名、UpdateDate、JoinDate 中的 4 列。

UUID 在两个表中都是唯一的和主要的。

表 A - 该表按预期工作。 表 A - 该表按预期工作

表 B - 由于额外的列用户名,该表不会插入/更新。 表 B - 这不起作用,因为它有一个名为用户名的额外列

知道为什么此查询不适用于表 B 吗?运行查询时是否必须插入/更新每个表列?这是我需要在主机上更改的 PHP 设置吗?

抱歉,如果我没有提供所有信息,这是我的第一个 DBSE 问题。

CREATE TABLE TestUserA` 
( UUID varchar(40) NOT NULL, 
  UpdateDate datetime NOT NULL, 
  JoinDate datetime NOT NULL 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

ALTER TABLE TestUser 
  ADD PRIMARY KEY (UUID), 
  ADD UNIQUE KEY UUID (UUID), 
  ADD KEY UUID_2 (UUID); 
Run Code Online (Sandbox Code Playgroud)
  • 服务器类型:MariaDB 服务器版本:10.2.14-MariaDB - MariaDB 服务器
  • 协议版本:10 cpsrvd 11.68.0.36
  • 数据库客户端版本:libmysql - 5.1.73
  • PHP 扩展名:mysqli
  • PHP 版本:5.6.30

ype*_*eᵀᴹ 5

知道为什么此查询不适用于表 B 吗?运行查询时是否必须插入/更新每个表列?

是的,UserName是一NOT NULL列,没有DEFAULT值。因此,您需要为每一行提供一个值INSERT。不为UPDATE虽然,列可以被更新或没有,根据您的要求。

这是我需要在主机上更改的 PHP 设置吗?

不,与 PHP 无关。

我有一个脚本,它在我的旧主机上运行得非常好......

如果脚本在以前的服务器中运行良好,则在插入任一表时,表的传输方式不同。额外的列 - 除了脚本为其提供值的 3 列之外 - 将被定义为NULL(因此它们会有一个DEFAULT NULL),或者可能DEFAULT在创建表时定义了一个属性。

另一种可能性 - 除了缺少DEFAULT属性 - 是该表有一个INSERT触发器UserName,该触发器在插入时自动为 提供值,并且在传输数据库时没有正确复制触发器。