如何在调用后立即从mysql中删除一行?

时间:2013-06-16 05:25:53

标签: mysql sql-delete

基本上,我有一个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

2 个答案:

答案 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_*扩展程序,因此请使用预先准备好的语句mysqliPDO

使用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` &gt; DATE_SUB(NOW(), INTERVAL 0 SECOND); ),以便能够判断添加行的时间。

然后您可以运行以下MySQL查询。

{{1}}

您需要将其作为cron作业运行。 AFAIK它不能单独在MySQL中完成。