基本上,我有一个mysql数据库,每当我得到一行时,我想从数据库中删除它(在阅读其信息后)。
我知道我可以做类似
的事情$result = mysql_query(" SELECT <some row> FROM table ");
$row = mysql_fetch_array($result);
$id = $row["id"];
mysqli_query(" DELETE FROM table WHERE id=$id");
但现在看来我有两个查询正在进行中。是否有一个命令告诉mysql我希望删除的行一旦它给我信息?我想这会节省时间和资源。
在我看来,它看起来像是
$result = mysql_query(" SELECT <some row> FROM table THEN DELETE ");
编辑附加信息:我希望在删除行后使用SELECTed信息。简单地说,我只希望在任何给定时间存在一个信息实例;就好像我只是“移动”了一个信息的物理副本,所以当它放在一个设备/你有什么时,它就不再在表中,因为只有一个副本。
很抱歉,如果我对mysql的理解很粗糙 - 我很陌生:P
答案 0 :(得分:2)
我不知道你为什么需要它但你可以使用存储过程:
DELIMITER $$
CREATE PROCEDURE select_and_delete(IN aid INT)
BEGIN
SELECT * FROM table1 WHERE id = aid;
DELETE FROM table1 WHERE id = aid;
END$$
DELIMITER ;
这是 SQLFiddle 演示。
不推荐使用 mysql_*
扩展程序,因此请使用预先准备好的语句mysqli
或PDO
。
使用PDO的PHP代码可能看起来像
$id = 1;
try {
$db = new PDO('mysql:host=localhost;dbname=test;charset=UTF8', 'user', 'userpwd');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$query = $db->prepare("CALL select_and_delete(?)");
$query->execute(array($id));
$result = $query->fetchAll(PDO::FETCH_ASSOC);
} catch (PDOException $e) {
echo "Exception: " .$e->getMessage();
$result = false;
}
$query = null;
$db = null;
//do whatever you need to do with your resultset
var_dump($result);
如果你用id
调用它,那么在SQL Fiddle示例中显示一个相当简化的表结构(只有列$id=1
),你将获得$ result:
array(1) {
[0]=>
array(1) {
["id"]=>
int(1)
}
}
答案 1 :(得分:0)
您需要添加时间戳字段(默认为DELETE FROM `table` WHERE `timestamp` > DATE_SUB(NOW(), INTERVAL 0 SECOND);
),以便能够判断添加行的时间。
然后您可以运行以下MySQL查询。
{{1}}
您需要将其作为cron作业运行。 AFAIK它不能单独在MySQL中完成。