1

我需要编写一个 MySQL delete-from-table-by-id 存储过程,其中包含表名和 ID 号作为调用时发送到过程的参数。表名参数告诉要从哪个表中删除,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。因此,在 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 回答