2017-04-27 68 views
1

我将在MariaDB中处理学生成绩的表格。当学生发送新的成绩时,我需要首先检查学生的记录是否存在于表格中,如果是,则更新如果新成绩高于现有成绩。如果学生不在表格中,请插入新的记录。是否可以为此作业编写一个sql查询:select,然后比较然后插入/更新

以下是我的PHP代码(为简单起见,假设学生的名字是约翰和他的新等级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是主键。是不是真的,在最糟糕的情况下,上面的代码需要搜索表两次?

+0

你的代码已经够简单了。试图在单个sql语句中使它更难以阅读和理解。它已经很好了。在一个代码中有更具体的理由吗? –

+0

@JorgeCampos我的意思是如果'插入...重复密钥更新'可以在这里使用?在最坏的情况下,上面的代码需要搜索表两次? –

回答

1

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

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

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

+0

谢谢。我已经阅读了文档,所以下面的查询正确:'在重复键更新等级= if(等级<100,100,等级)'时插入到grade_sheet(名称,等级)值('john',100)' –

+0

现在我使用学生身份证号码作为主键,这是唯一的。 –

+0

我会在这里使用数字键代替'john',因为john不可能是唯一的 – e4c5

相关问题