Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.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 SQL Insert不使用多个WHERE条件_Php_Mysql_Sql - Fatal编程技术网

Php SQL Insert不使用多个WHERE条件

Php SQL Insert不使用多个WHERE条件,php,mysql,sql,Php,Mysql,Sql,我有一个查询要根据4个WHERE条件进行更新。当我执行此操作时,更新了0条记录。我很困惑,因为有一个记录符合这些条件 查询: UPDATE tp_margins SET cost = '139.00', updated = '2020-08-03 16:00:53' WHERE itemNumber='LATITUDE 5480' AND ff='TOUCH' AND proc='i5' AND category='LAPTOP' 如果删除WHERE ff,它会更新,

我有一个查询要根据4个WHERE条件进行更新。当我执行此操作时,更新了0条记录。我很困惑,因为有一个记录符合这些条件

查询:

UPDATE tp_margins
    SET cost = '139.00',
        updated = '2020-08-03 16:00:53'
 WHERE itemNumber='LATITUDE 5480' AND ff='TOUCH' AND proc='i5' AND category='LAPTOP'
如果删除WHERE ff,它会更新,但所有匹配的记录都会忽略ff。 这是表格:

CREATE TABLE `tp_margins` (
  `margins_ID` int(11) NOT NULL,
  `itemNumber` varchar(80) NOT NULL,
  `ff` varchar(30) DEFAULT NULL,
  `proc` varchar(30) DEFAULT NULL,
  `sku` varchar(140) NOT NULL,
  `category` varchar(40) NOT NULL,
  `cost` decimal(8,2) NOT NULL,
  `shipping` decimal(8,2) DEFAULT NULL,
  `opex` decimal(8,2) DEFAULT NULL,
  `hdd` decimal(8,2) DEFAULT NULL,
  `ram` decimal(8,2) DEFAULT NULL,
  `kbm` decimal(8,2) DEFAULT NULL,
  `coa` decimal(8,2) DEFAULT NULL,
  `salePrice` decimal(8,2) NOT NULL,
  `updated` varchar(40) DEFAULT '--------'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

这个Mysql更新有什么问题吗?

你没有问题。您可以从查找匹配项开始:

SELECT m.*
FROM tp_margins m
WHERE m.itemNumber = 'LATITUDE 5480' AND m.proc = 'i5' AND m.category = 'LAPTOP' AND
      m.ff = 'TOUCH'
当它什么也没有返回时,你必须问为什么。我建议使用
LIKE
查看有哪些类似的值:

SELECT m.*
FROM tp_margins m
WHERE m.itemNumber = 'LATITUDE 5480' AND m.proc = 'i5' AND m.category = 'LAPTOP' AND
      m.ff LIKE '%TOUCH%'
字符串看起来相同但不同的原因可能是有的。最常见的是:

  • 前导空格
  • 看不见的字符
  • 看起来相似的字符(例如小写L和数字1)
请注意,您似乎打算将
更新
作为日期/时间。应该这样宣布。事实上,在MySQL中,当行被更新时,您可以让它自动更新。

当update语句匹配一行(或多行)并且要更新的行实际上没有被更新修改时,MySQL将报告“受影响的0行”。。。也就是说,如果我们将列设置为当前值

在SELECT语句中测试WHERE子句中的条件

然后,对于返回的行,检查要更新的列的当前值

我们可以使用一个实际更改列中值的值来测试更新,然后将其更改回我们想要的状态。(我们还应该提到,UPDATE语句将触发任何更新前/更新后触发器,以防触发器的效果很重要。)


参考:


“对于UPDATE语句,默认情况下,受影响的行数值是实际更改的行数。如果在连接mysqld时将CLIENT_FOUND_rows标志指定为mysql_real_connect(),则受影响的行数值是“已找到”的行数;也就是说,与WHERE子句匹配。”

是否有任何错误?您是否检查了错误日志?执行:
SELECT*FROM tpu margins,其中itemNumber='LATITUDE 5480'和ff='TOUCH'以及proc='i5'和category='LAPTOP'
以验证是否有行。SELECT*FROM tpu margins,其中itemNumber='LATITUDE 5480'和ff='TOUCH'以及proc='i5'和category='LAPTOP'返回一行。这很好。请注意,如果您正在设置的值已经是该行中的值,则受更新影响的行将报告为零。也就是说,如果更新没有导致数据发生净变化,则受影响的行数为零。正如@BillKarwin提到的,您设置的新值与旧值完全相同。当我运行您的第一次查询时,将返回记录。当我运行第二个select查询时,将返回记录。只有当我尝试根据相同的确切条件进行更新时,我才一无所获。仍然非常混乱。“0行受影响”表示没有实际更改的行;这并不一定意味着没有匹配的行。@JasonBrashear。此外,
update
查询不会返回任何内容。是否有方法检查值是否为null以及是否也等于?ff为null或ff=“TOUCH”@JasonBrashear:就像那样,但是使用parens覆盖AND和or的优先顺序<代码>其中。。。和(ff='TOUCH'或ff为空)和proc='i5'和…
。。。或者,我们可以使用将NULL转换为“TOUCH”或将NULL转换为“TOUCH”的表达式,例如
。。。和IFNULL(ff,'TOUCH')='TOUCH'和…