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");

しかし、今では2つのクエリが進行しているようです。情報が得られたらすぐに行を削除するように mysql に指示するコマンドはありますか? 時間とリソースを節約できると思います。

私の頭の中では、次のように見えます

$result = mysql_query(" SELECT <some row> FROM table THEN DELETE ");

EDIT 追加情報: 行を削除した後、SELECT された情報を使用したいと考えています。簡単に言えば、情報のインスタンスが常に 1 つだけ存在するようにしたいということです。情報の物理コピーを「移動」しているだけのように見えるため、デバイスに配置すると、コピーが1つしかないため、テーブルに表示されなくなります。

私の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_*extension は推奨されないため、準備済みステートメントおよび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);

idSQL Fiddle の例に示されているかなり単純化されたテーブル構造 ( column のみ) に従うと$id=1、 $result でそれを呼び出すと、次のようになります。

array(1) {
  [0]=>
  array(1) {
    ["id"]=>
    int(1)
  }
}
于 2013-06-16T05:55:52.037 に答える