考虑一个有一些行的表。 由php,我做了一个SQL查询,如“删除*从my_table”。 如何在运行sql查询之前识别受影响的行。换句话说,我想在sql查询之后和运行之前获得受影响的行的列表。如何在运行sql查询之前检查受影响的行?
总而言之,我想在运行SQL不可逆查询之前检查一些东西。
最好的方面。
考虑一个有一些行的表。 由php,我做了一个SQL查询,如“删除*从my_table”。 如何在运行sql查询之前识别受影响的行。换句话说,我想在sql查询之后和运行之前获得受影响的行的列表。如何在运行sql查询之前检查受影响的行?
总而言之,我想在运行SQL不可逆查询之前检查一些东西。
最好的方面。
您可以使用与DELETE
相同的JOIN
和WHERE
条件执行SELECT
查询。这将返回将被删除的行。
如果您想要完美的安全性,则需要在访问表的所有应用程序中使用事务。执行DELETE
的过程应在同一事务中执行SELECT
。否则,另一个进程可能会在SELECT
和DELETE
之间的表中添加行,并且如果符合条件,则可能会将其删除。
如果您只是试图通过对结果进行眼球检查来验证您的DELETE
查询的逻辑,这可能是矫枉过正的。
这是一个简单的答案,但是如果人们担心一致性,实际上需要锁定表以防止SELECT和DELETE之间的其他更改。 – 2014-11-04 21:17:21
假设你有一个像DELETE查询:
DELETE FROM my_table WHERE foo='bar'
要看到多少条记录将被删除,你可以先运行:
SELECT count(*) from my_table where foo='bar'
该查询的结果将是符合相同条件的记录数。
他说他想要一个行列表,而不仅仅是一个计数。 – Barmar 2014-11-04 21:09:47
谢谢,虽然我想要一个受影响行的列表,但我通过一些小的更改解决了您的想法。 – VictoryMarch 2017-01-02 05:01:18
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);
}
这将允许您在删除之前执行记录验证。
如果在DELETE查询中存在'JOIN',那么这将不起作用,但您只想从连接中的一个表中删除。 – Barmar 2014-11-04 21:11:35
@Barmar - 真的,但范围并不在问题中。但是,实现起来并不太困难,因为你会修改你的'SELECT'语句以允许'JOIN',然后使用'for'循环运行带有'WHERE'条件的'DELETE'语句来考虑所述'JOIN'标准。 – PlantTheIdea 2014-11-04 21:12:25
您可以使用SELECT,然后使用mysqli_affected_rows获取要删除的行数。 如果你需要来自行的数据,那么你可以使用SELECT来获取它。
添加说明你的语句之前
这种情况下是不可能的 – 2014-11-04 21:03:23
顺便说一句,*“'删除*从my_table'” * - 它不工作的方式,只是让你提前知道时间;) – 2014-11-04 21:04:06
据据我所知,它只能用两个查询来完成。一个SELECT和一个DELETE,两者都具有相同的标准。 – Barry 2014-11-04 21:06:34