1

呼び出されたときにプロシージャに送信されるパラメータとしてテーブル名と ID 番号を使用して、MySQL のテーブルからテーブルを削除するストアド プロシージャを作成する必要があります。テーブル名パラメーターは、削除するテーブルを示し、ID パラメーターは、テーブル内のどの行を削除するかを示します。

これが私の機能しない解決策です:

CREATE PROCEDURE delete_from_table_by_id(IN IN_TABLE_NAME VARCHAR(255),
                                         IN IN_ROW_ID     INT UNSIGNED)
BEGIN
    DELETE FROM IN_TABLE_NAME
    WHERE CONCAT(IN_TABLE_NAME, '_id') = IN_ROW_ID;
END$$

次のように動作するはずです: book、author、publisher などの名前のテーブルがあります。私のデータベースの各テーブルの ID 列は、 table_name_idの 2 つの部分で構成されています。したがって、author テーブルでは ID 列の名前はauthor_idであり、book テーブルではbook_idという名前です。たとえば、次のコードは book テーブルから ID 456 の行を削除する必要があります。

CALL delete_from_table_by_id('book', 456);

よろしくお願いします。

4

2 に答える 2

1

テーブル名または列名に変数を使用することはできません。

最も簡単な解決策は、prepareexecuteを使用することです。

SET @s = 'DELETE FROM ? WHERE CONCAT(?, '_id') = ?';

PREPARE stmt2 FROM @s;

SET @inTableName = 'some_table';
SET @inRowId = 42;

EXECUTE stmt2 USING @inTableName, @inTableName, @inRowId;

私はこのコードを頭から取り出しました。私はそれを試していません。しかし、私はそれがうまくいくはずだと確信しています。

于 2013-04-17T20:53:58.823 に答える
0

ありがとう。動作する私のコードは次のとおりです。

CREATE PROCEDURE delete_from_table_by_id(IN IN_TABLE_NAME VARCHAR(255),
                                         IN IN_ROW_ID     INT UNSIGNED)
BEGIN
    SET @SQL = CONCAT('DELETE FROM ', IN_TABLE_NAME,
                      ' WHERE ', IN_TABLE_NAME,
                      '_id = ', IN_ROW_ID);
    PREPARE stmt FROM @SQL;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
END$$
于 2013-04-17T21:29:43.427 に答える