CURD语句如何使用我这个表名变量呢

K-dash 2017-03-23 12:45:18
以下构造数据的储存过程,我企图让tableName这个参数控制创建的表名


delimiter //
DROP PROCEDURE IF EXISTS mockData//
CREATE PROCEDURE mockData(IN tableName VARCHAR(20), IN rowCount INT)
BEGIN
DECLARE insertCount INT;

SET insertCount = 0;
DROP TABLE IF EXISTS tableName;
CREATE TABLE tableName (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(20) NOT NULL,
`age` TINYINT(3) NOT NULL,
PRIMARY KEY (`id`),
KEY `name` (`name`),
KEY `age` (`age`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

start transaction;
loop_handler : LOOP
INSERT INTO tableName(`name`,`age`) VALUES( rand_string(20), ceil(rand()*110) );
set insertCount = insertCount + 1;
if (insertCount >= rowCount) then
leave loop_handler;
end if;
end LOOP loop_handler;
commit;
END;//
delimiter ;


但是它直接就是创建了一个叫tableName的表名,我找了一些资料并没有发现能教我在类似insert into语句里让那个tableName转义成我所定义的IN参数里的tableName
...全文
222 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
K-dash 2017-03-24
  • 打赏
  • 举报
回复
引用 4 楼 zjcxc 的回复:
...... 写得很清楚了,是直接的表名
如果直接写表名的话,我只能写死表名了吗,如何通过储存过程的存入参数表达一个表名呢,我希望通过参数控制处理的表名
zjcxc 2017-03-24
  • 打赏
  • 举报
回复
看官网文档语法 https://dev.mysql.com/doc/refman/5.7/en/insert.html VALUES | VALUE} ({expr | DEFAULT},...),(...),... 对于 insert values,里面的值可以是 expr, 这个 expr,expr 简单的说,可以是列名/常量/变量或者是它们的计算结果 而 drop table 的语法 https://dev.mysql.com/doc/refman/5.7/en/drop-table.html DROP [TEMPORARY] TABLE [IF EXISTS] tbl_name [, tbl_name] ... [RESTRICT | CASCADE] 写得很清楚了,是直接的表名
K-dash 2017-03-23
  • 打赏
  • 举报
回复
也就是exists ? insert into ? create table ? 这些地方加问号没用,请问怎么用才是正确的呢
K-dash 2017-03-23
  • 打赏
  • 举报
回复
引用 1 楼 zjcxc 的回复:
使得 PREPARE 动态语句
找了些关于PREPARE的资料,都说在values(?,?)这样用参数或 md5(?)甚至5.7版本可以 limit ?,?这样的,但我这样用的就不行:

delimiter //
DROP PROCEDURE IF EXISTS delTable//
CREATE PROCEDURE delTable(IN tableName VARCHAR(20))
BEGIN	
	SET @tbName = tableName;
	
	PREPARE dropTable FROM "DROP TABLE IF EXISTS ?";
	EXECUTE dropTable USING @tbName;
END;//
delimiter ;
然后call delTable('test')就报错如下:

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?' at line 1
======== 我的整个代码是这样的,但不可用:

delimiter //
DROP PROCEDURE IF EXISTS mockData//
CREATE PROCEDURE mockData(IN tableName VARCHAR(20), IN rowCount INT)
BEGIN
	DECLARE insertCount INT;
	
	SET insertCount = 0;
	
	set @tbName = tableName;
	
	PREPARE dropTable FROM "DROP TABLE IF EXISTS ?";
	EXECUTE dropTable USING @tbName;
	
	PREPARE createTable FROM "
	CREATE TABLE ? (
		`id` INT(11) NOT NULL AUTO_INCREMENT,
		`name` VARCHAR(20) NOT NULL,
		`age` TINYINT(3) NOT NULL,
		PRIMARY KEY (`id`),
		KEY `name` (`name`),
		KEY `age` (`age`)
	) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1";
	EXECUTE dropTable USING @tbName;
	
	start transaction;
	PREPARE insertRecord FROM "INSERT INTO ? (`name`,`age`) VALUES( rand_string(20), ceil(rand()*110) )";
	loop_handler : LOOP
		EXECUTE insertRecord USING @tbName;
		set insertCount = insertCount + 1;
		if (insertCount >= rowCount) then
			leave loop_handler;
		end if;
	end LOOP loop_handler;
	commit;
END;//
delimiter ;
zjcxc 2017-03-23
  • 打赏
  • 举报
回复
使得 PREPARE 动态语句

56,683

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧