2014-11-04 98 views
0

考慮一個有一些行的表。 由php,我做了一個SQL查詢,如「刪除*從my_table」。 如何在運行sql查詢之前識別受影響的行。換句話說,我想在sql查詢之後和運行之前獲得受影響的行的列表。如何在運行sql查詢之前檢查受影響的行?

總而言之,我想在運行SQL不可逆查詢之前檢查一些東西。

最好的方面。

+0

這種情況下是不可能的 – 2014-11-04 21:03:23

+0

順便說一句,*「'刪除*從my_table'」 * - 它不工作的方式,只是讓你提前知道時間;) – 2014-11-04 21:04:06

+1

據據我所知,它只能用兩個查詢來完成。一個SELECT和一個DELETE,兩者都具有相同的標準。 – Barry 2014-11-04 21:06:34

回答

3

您可以使用與DELETE相同的JOINWHERE條件執行SELECT查詢。這將返回將被刪除的行。

如果您想要完美的安全性,則需要在訪問表的所有應用程序中使用事務。執行DELETE的過程應在同一事務中執行SELECT。否則,另一個進程可能會在SELECTDELETE之間的表中添加行,並且如果符合條件,則可能會將其刪除。

如果您只是試圖通過對結果進行眼球檢查來驗證您的DELETE查詢的邏輯,這可能是矯枉過正的。

+0

這是一個簡單的答案,但是如果人們擔心一致性,實際上需要鎖定表以防止SELECT和DELETE之間的其他更改。 – 2014-11-04 21:17:21

1

假設你有一個像DELETE查詢:

DELETE FROM my_table WHERE foo='bar'

要看到多少條記錄將被刪除,你可以先運行:

SELECT count(*) from my_table where foo='bar'

該查詢的結果將是符合相同條件的記錄數。

+1

他說他想要一個行列表,而不僅僅是一個計數。 – Barmar 2014-11-04 21:09:47

+0

謝謝,雖然我想要一個受影響行的列表,但我通過一些小的更改解決了您的想法。 – VictoryMarch 2017-01-02 05:01:18

0

1)創建用於分析的行的函數:

function checkRows($table){ 
    $query = 'SELECT * FROM ' . $table; 

    // execute SELECT query 
    // get the result 
    // using for loop, set $delete boolean based on whether to delete or not 

    return $delete; 
} 

2)創建刪除東西的函數:

function deleteFromTable($table){ 
    $query = 'DELETE FROM ' . $table; 

    // execute DELETE query 
} 

3)創建條件調用:

$table = 'SomeTable'; 
$validDelete = checkRows($table); 

if($validDelete){ 
    deleteFromTable($table); 
} 

這將允許您在刪除之前執行記錄驗證。

+0

如果在DELETE查詢中存在'JOIN',那麼這將不起作用,但您只想從連接中的一個表中刪除。 – Barmar 2014-11-04 21:11:35

+0

@Barmar - 真的,但範圍並不在問題中。但是,實現起來並不太困難,因爲你會修改你的'SELECT'語句以允許'JOIN',然後使用'for'循環運行帶有'WHERE'條件的'DELETE'語句來考慮所述'JOIN'標準。 – PlantTheIdea 2014-11-04 21:12:25

0

您可以使用SELECT,然後使用mysqli_affected_rows獲取要刪除的行數。 如果你需要來自行的數據,那麼你可以使用SELECT來獲取它。

0

添加說明你的語句之前

相關問題