需求说明. mysql数据库中创建数据库和表
CREATE DATABASE xx; USE xx
CREATE TABLE x1 (
id VARCHAR(20) NOT NULL DEFAULT ''
); PC机上 C:/up01.sql
up01.sql文件里面的内容是: ALTER TABLE x1 CHANGE id idd VARCHAR(60); 现在我想用一个存储过程来完成这个操作.
USE xx DELIMITER $$
CREATE PROCEDURE xxx()
BEGIN
-- 在这个地方,我将用什么方法能够把本机上C:/up01.sql文件导入到对应的数据库中.
END $$
DELIMITER ;求各位大哥明示~~~~~
CREATE DATABASE xx; USE xx
CREATE TABLE x1 (
id VARCHAR(20) NOT NULL DEFAULT ''
); PC机上 C:/up01.sql
up01.sql文件里面的内容是: ALTER TABLE x1 CHANGE id idd VARCHAR(60); 现在我想用一个存储过程来完成这个操作.
USE xx DELIMITER $$
CREATE PROCEDURE xxx()
BEGIN
-- 在这个地方,我将用什么方法能够把本机上C:/up01.sql文件导入到对应的数据库中.
END $$
DELIMITER ;求各位大哥明示~~~~~
再动态执行,
为什么一定要用SP,直接
D:\mysql6\bin\mysql -uroot -p123 test<c:\1.sql不行
针对这个问题,我继续增加点需求说明。其实我也不想用SP的。但最重要的是. 其实不止一个 up01.sql文件。还有up02.sql up03.sql......这些都是在不同的IF中去执行的。例如IF i>1 THEN
-- 执行up01.sql
END IF;IF i<1 THEN
-- 执行up02.sql
END IF;=====================================如果我不用SP我将不法判断是否执行哪一个*.sql文件所以我选择SP。。
LOAD DATA INFILE '/tmp/up01.sql' INTO TABLE test;
select sql into @sql from test;
prepare dd from @sql;
execute dd;
END IF;
CREATE PROCEDURE xxx()
BEGIN
LOAD DATA INFILE '/tmp/up01.sql' INTO TABLE test;
select sql into @sql from test;
prepare dd from @sql;
execute dd;
END $$
DELIMITER ;LOAD DATA is not allowed in stored procedures
貌似一样的用不鸟
执行
这个貌似不行,表数据大多都是1000W行的。。全部倒入用标识符去选择。。性能上会死人的 那请问。不用SP或别的什么高招,能解决这个问题吗?
除非你的这个SQL脚本用LOAD DATA把这个文件加载到表中,然后再从表中生成SQL语句通过PREPARE,EXECUTE来执行。
你最终想实现的功能是什么?完成同一个功能,可能的方法有多种。
例如我有一个旧表
CREATE TABLE x1 (
id VARCHAR(20) NOT NULL DEFAULT ''
); 但是,我现在觉得这个表的字段不够用或者字段名需要改一下. 我就需要将其升级 ALTER TABLE x1 ADD name VARCHAR(10) NOT NULL DEFAULT '';
-- 或者
ALTER TABLE x1 CHANGE id idd VARCHAR(60);但是,现在我是要通过一个选择判断来执行,是否是加一个字段,还是改一下字段名。所以就要通过 IF 去判断 我就想完成一个这样的功能。。我本来就直接把这些执行语句,直接写到SP里面。不调用*.sql文件的。但是这些 ALTER TABLE xx1 ADD的语句不止一条,也不止一个表要改,有很多。维护很困难。不可取而且还根据不同的版本号去执行不同的修改。请问。ACMAIN_CHM 大哥,有什么好的方法吗?
=========================================================================
CREATE TABLE versionnum (
id INT NOT NULL auto_increment,
ver_num VARCHAR(20) NOT NULL,
PRIMARY KEY(id)
);
INSERT INTO versionnum(id,ver_num)VALUES(0,'1.0.0.1');
这是旧数据库里面已经有版本号~现在有个最新的版本 ver_num 1.0.0.3我需要判断这个字段是否是1.0.0.3。-- 如果这个ver_num 等于1.0.0.3就不需要升级.
-- 如果这个ver_num 等于1.0.0.1就需要改一些字段
-- 如果这个vev_num 等于1.0.0.2就需要修改另一些字段了。
SELECT ver_num FROM versionnum where id=1 ;
delete from test;
LOAD DATA INFILE '/tmp/v1111.sql' INTO TABLE test(col1);
set @sql='';
select @sql:=concat(@sql,col1) from test order by id;
prepare stmt from @sql;
execute stmt;
DEALLOCATE PREPARE stmt;
...