【问题标题】:Is it possible to write one sql query for this job: select, then compare then insert/update是否可以为这项工作编写一个 sql 查询:选择,然后比较,然后插入/更新
【发布时间】:2017-09-24 14:54:38
【问题描述】:

我将在 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 是主键。是不是,在最坏的情况下,上面的代码需要查表两次?

【问题讨论】:

  • 你的代码已经够简单了。尝试在单个 sql 语句中创建它会使其更难阅读和理解。它已经很好了。您是否有更具体的原因需要在一个代码中使用它?
  • @JorgeCampos 我的意思是如果insert ... on duplicate key update 可以在这里使用?最坏的情况,上面的代码需要查表两次?

标签: php mysql


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢。我已阅读文档,因此以下查询是否正确:insert into grade_sheet (name, grade) values ('john', 100) on duplicate key update grade = if(grade &lt; 100, 100, grade)
  • 现在我用学生证号作为主键,是唯一的。
  • 我会在这里使用数字键而不是 'john',因为 john 不太可能是唯一的
猜你喜欢
  • 1970-01-01
  • 2018-09-01
  • 2012-01-20
  • 1970-01-01
  • 1970-01-01
  • 2017-04-27
  • 1970-01-01
  • 2019-02-24
  • 1970-01-01
相关资源
最近更新 更多