复制排班表SQL行时,使用CASE条件修改weekstart字段的语句失效求助
复制排班表SQL行时,使用CASE条件修改weekstart字段的语句失效求助
看起来你的SQL语句有两个关键问题导致它失效,咱们一步步来梳理和修正:
问题1:字段数量不匹配
你在INSERT语句里只指定了要插入weekstart这一个字段,但SELECT后面却返回了两个值:原来的weekstart和CASE语句生成的新weekstart,数据库遇到这种字段数量不匹配的情况肯定会报错。
正确的思路是:SELECT里只保留CASE生成的新weekstart值,同时把你需要复制的其他字段(比如shift、employid、name这些,和你最初能正常运行的代码保持一致)也加进来,让INSERT的字段列表和SELECT返回的字段数量完全对应。
问题2:缺少过滤条件,会复制全表数据
你原来的代码是只复制特定weekstart的行,但修改后的SQL去掉了WHERE子句,这会把整个myrota表的所有行都复制一遍——这显然不是你想要的,你应该只复制weekstart等于$dateone或$datetwo的目标行。
修正后的代码
$dateone = "2026-03-02"; $datetwo = "2026-03-09"; $datethree = "2026-03-16"; $datefour = "2026-03-23"; // 修正后的SQL语句 $sql = "INSERT INTO myrota (weekstart, shift, employid, name, mon, tue) SELECT CASE WHEN weekstart = '$dateone' THEN '$datethree' WHEN weekstart = '$datetwo' THEN '$datefour' ELSE weekstart -- 由于WHERE已经筛选了目标行,这个ELSE其实可以不用,保险起见保留 END, shift, employid, name, mon, tue FROM myrota WHERE weekstart IN ('$dateone', '$datetwo')"; -- 只筛选需要复制的行
额外提醒:避免SQL注入风险
直接把变量拼进SQL语句存在严重的SQL注入风险,建议你使用PHP的预处理语句来绑定变量,下面是PDO的示例:
// 假设你已经建立了PDO连接$pdo $stmt = $pdo->prepare("INSERT INTO myrota (weekstart, shift, employid, name, mon, tue) SELECT CASE WHEN weekstart = ? THEN ? WHEN weekstart = ? THEN ? ELSE weekstart END, shift, employid, name, mon, tue FROM myrota WHERE weekstart IN (?, ?)"); // 按顺序绑定变量并执行 $stmt->execute([$dateone, $datethree, $datetwo, $datefour, $dateone, $datetwo]);
备注:内容来源于stack exchange,提问作者kumbi
相关产品推荐
相关产品推荐

