我需要编写一个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);
提前谢谢大家。
答案 0 :(得分:1)
您不能将变量用于表名或列名。
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$$