2017-04-27 56 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

相關問題