MySQL从表中删除存储过程,其中包含表名和ID号作为参数

时间:2013-04-17 20:27:05

标签: mysql

我需要编写一个MySQL delete-from-table-by-id存储过程,其中包含一个表名和一个ID号作为调用时发送给过程的参数。 table name参数告诉要删除哪个表,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 。因此,在作者表中,ID列名为 author_id ,在书表中名为 book_id 。例如,以下代码应该从书表中删除ID为456的行:

CALL delete_from_table_by_id('book', 456);

提前谢谢大家。

2 个答案:

答案 0 :(得分: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;

我把这个代码从脑子里拿出来了;我还没试过。但我很确定它应该有用。

答案 1 :(得分: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$$