0

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

4

2 回答 2

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_*扩展名已被弃用,因此使用准备好的语句和mysqlior 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)
  }
}
于 2013-06-16T05:55:52.037 回答
0

您需要添加一个时间戳字段(默认为CURRENT_TIMESTAMP),以便能够判断何时添加了该行。

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

DELETE FROM `table` WHERE `timestamp` &gt; DATE_SUB(NOW(), INTERVAL 0 SECOND);

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

于 2017-06-12T14:30:02.053 回答