2014-11-04 82 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

添加说明你的语句之前

相关问题