MySQL:是否有可能在UPDATE上CASE一个FIELD?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL:是否有可能在UPDATE上CASE一个FIELD?相关的知识,希望对你有一定的参考价值。

所以我可能只是忽略了一些简单的愚蠢,但实际上我试图通过php页面来使用CAS来更新mysql中的UPDATE。我也运行了大量的IF语句,但似乎无法使其发挥作用。

<?php
include('config.php');
$username = $_POST['username'];
$charName = $_POST['charName'];
//ID MARKS
$idMarks = $_POST['IDmarks'];
//EXPERIENCE
$EXP = $_POST['EXP'];

$sql = "UPDATE characters 
            SET CASE 
                WHEN idMarks1 IS NULL THEN idMarks1 = '$idMarks' 
                WHEN idMarks2 IS NULL THEN idMarks2 = '$idMarks' 
                WHEN idMarks3 IS NULL THEN idMarks3 = '$idMarks' 
                WHEN idMarks4 IS NULL THEN idMarks4 = '$idMarks' 
                WHEN idMarks5 IS NULL THEN idMarks5 = '$idMarks' 
                WHEN idMarks6 IS NULL THEN idMarks6 = '$idMarks' 
                WHEN idMarks7 IS NULL THEN idMarks7 = '$idMarks' 
                WHEN idMarks8 IS NULL THEN idMarks8 = '$idMarks' 
                WHEN idMarks9 IS NULL THEN idMarks9 = '$idMarks' 
                WHEN idMarks10 IS NULL THEN idMarks10 = '$idMarks' 
                WHEN idMarks11 IS NULL THEN idMarks11 = '$idMarks' 
                WHEN idMarks12 IS NULL THEN idMarks12 = '$idMarks' 
                END

                totalEXP =  totalEXP + '$EXP', 
                remEXP =    remEXP + '$EXP'

            WHERE charName = '$charName' AND username = '$username';
        ";

if ($conn->query($sql) === TRUE) {
header("Location: ../lead.php");
} else {
    echo "Error updating record: " . $conn->error;
}
?>

这里的想法是更新将新值($ idMarks)放在它找到的第一个空值中,然后滚动到下一个EXP列。由于我之前遇到的问题,我不能使用数组,重点是idMarks列有流动性,跟踪伤口,伤口愈合疤痕或跛行,纹身是永久性的等等,这就是为什么它们是可调节的在另一页上。有没有人对如何解决这个问题有任何想法?

答案

你有PHP,为什么要在SQL中做怪癖?

$error = false;
for($i=1; $i<12; $i++) {
    $sql = "UPDATE characters  SET idMarks$i = '$idMarks'"
        . " WHERE idMarks$i IS NULL AND charName = '$charName' AND username = '$username';";
    $sql2 = "UPDATE characters SET totalEXP =  totalEXP + '$EXP', remEXP =    remEXP + '$EXP'"
        . " WHERE charName = '$charName' AND username = '$username';";

    if ($conn->query($sql) !== TRUE) {
        $error = 'Failed with 1';
        break;
    } else if ($conn->query($sql2) !== TRUE) {
        $error = 'Failed with 2';
        break;
    }
}

 if (empty($error))
     header("Location: ../lead.php");

我将跳过“你从哪里得到那个可怕的数据库方案”这个问题,但是这个问题应该是“我想在一个请求中做出所有”优化性能“不合理的问题。

对于具有编号列的方案,SQL性能不佳。 Normalization排在第一位,只有在极少数情况下你才需要非规范化。

以上是关于MySQL:是否有可能在UPDATE上CASE一个FIELD?的主要内容,如果未能解决你的问题,请参考以下文章

mysql笔记(10)-数据的插入和更新(insert/update/case)

UPDATE + CASE WHEN + EXISTS + SELECT MAX 的 MySQL 语法

UPDATE CASE 中的 SIGNAL SQLSTATE

mysql 批量value插入 批量update case when then

sql技巧mysql修改时,动态指定要修改的字段 update `table` set (case when ....) = 1 where id = xx

T-SQL:在 UPDATE 语句中使用 CASE 根据条件更新某些列