是否可以为此作业编写一个sql查询:select,然后比较然后插入/更新

时间:2017-04-27 01:29:27

标签: php mysql

我打算在MariaDB中为学生的成绩处理一张桌子。当学生发送新成绩时,我需要首先检查表中是否存在学生记录,如果是,则更新新成绩是否高于现有成绩。如果表中不存在学生,请插入新记录。

以下是我的PHP代码(为简单起见,假设学生姓名是John,他的新成绩是100,$connmysqli对象):

$result =  $conn->query("select name, grade from grade_sheet where name='john' and grade<100");

if ($result->num_rows > 0) {
    $conn->query("update grade_sheet set grade=100 where name='john'");
} else {
    $conn->query("insert into grade_sheet (name, grade) values ('john', 100)");
}

是否可以简化代码?更具体地说,是否可以使用类似insert ... on duplicate key update

此处name是主键。在最坏的情况下,上述代码需要搜索两次表吗?

1 个答案:

答案 0 :(得分:1)

与评论中提到的相反,这是错误的做法,你想改变它是正确的。您应该更改它的原因是为了避免竞争条件,另一个线程可能会修改您的两个查询之间感兴趣的记录。

如果你有一个合适的索引,那么性能不会有太大差别,但如果你正在进行这种查询,你可能不会。您应该在此表上使用自动增量主键,并使用该列而不是“John”来引用它,这不太可能是唯一的。然后应该有一个记录学生姓名的学生表的外键

然后,您可以使用INSERT ... ON DUPLICATE KEY UPDATE在单个查询中完成工作。安全。

相关问题