Php SQL Insert不使用多个WHERE条件
我有一个查询要根据4个WHERE条件进行更新。当我执行此操作时,更新了0条记录。我很困惑,因为有一个记录符合这些条件 查询: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,它会更新,
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'和…