您的位置:首页 > 数据库 > MySQL

sqlserver至mysql的数据迁移,批量清空数据和批量删除指定字段

2018-01-29 17:18 1056 查看

本文为博主原创文章,转载请获得原作者同意并注明来源:http://blog.csdn.net/wengminyu/article/details/79196928

文中工具下载地址:mss2sql 4.1版本

sqlserver至mysql的数据迁移

 实际需求遇到将sqlserver的数据转移到mysql上,通过使用Navicat、mysql workbench和mss2sql三种工具,最终认为mss2sql最优。这个工具实际转换速度最快,并且能够保证外键关联仍在。缺点是比较小众,正版需要付费,而crack版已经是很老的版本了,功能不够强大,比如不能迁移视图。下面介绍操作步骤:

1.下载mss2sql工具,这个工具是要付费的,网上能找到的crack版已经是大约10年前了,不过应该是够用的。下载完成后直接打开mss2sql.exe使用。

2.直接点击下一步



3.填写sqlserver的连接地址和身份验证,点下一步



4.填写mysql的连接地址,一般选择远程连接(Remote),mysql默认端口号为3306



5.上方选择要导出的sqlserver的数据库,下方自行填写导出到mysql的数据库,右侧第一个勾选框表示只导出数据库结构定义,不导出数据,第二个表示跳过索引的转换。一般都不勾选。点下一步。



6. 可能会弹出警告框,这是因为要导出到mysql的数据库已经存在了。四个选项第一个是覆盖整个数据库,第二个是仅仅覆盖已存在的表,第三个是跳过已存在的表,第四个是合并冲突的表。根据情况自行选择。



7.出现了sqlserver里所有的表名,选择add all将所有的表都导出到mysql,也可以选择某几张表进行导出。可以点击add query添加自定义的sql query。点下一步就开始转换,等待片刻就完成了。



批量清空表数据

 除了数据迁移之外,还需要批量清空表的数据,并且有一部分表的数据需要保留,并不是所有表都要清空。下面直接给出sql语句并做简单注释。

mysql版

SET group_concat_max_len = 8096;

SELECT
GROUP_CONCAT( 'DELETE FROM ', t.TABLE_NAME SEPARATOR ';\n' ) as sqlString
FROM
information_schema.`TABLES` AS t
WHERE
t.TABLE_SCHEMA = DATABASE()
AND ( t.TABLE_NAME LIKE 'p%' OR t.TABLE_NAME LIKE 'r%' OR t.TABLE_NAME LIKE 's%' );

SET group_concat_max_len = 1024;

#无视外键关联进行删除
SET FOREIGN_KEY_CHECKS = 0;
SET FOREIGN_KEY_CHECKS = 1;

 查询出的结果是可执行的sql语句,将语句复制后执行即可,这里清空的是以p,r,s开头的表,可以根据实际清空做调整。清空之前需要先设置取消外键约束,最后再加上外键约束,否则无法成功删除。

sqlserver版

SELECT
stuff (
(
SELECT
'DELETE FROM ' + s.NAME + ';'
FROM

95e8
sysobjects AS s
WHERE
s.xtype = 'U'
AND ( s.NAME LIKE 'p%' OR s.NAME LIKE 'r%' OR s.NAME LIKE 's%' )
FOR XML path ( '' )
),
1,
0,
''
) as statement

--无视外键关联进行删除
EXEC sp_MSforeachtable @command1='alter table ?  NOCHECK constraint all';

EXEC sp_MSforeachtable @command1='alter table ?  CHECK constraint all';

在sqlserver中需要使用上述的语句,语法和mysql不同,不过实现的功能是一样的。

mysql使用存储过程版

DROP PROCEDURE IF EXISTS Drop_Table;
DELIMITER $$
CREATE PROCEDURE Drop_Table()
BEGIN
DECLARE tname VARCHAR(64);
DECLARE done int default 0;
DECLARE tname_cursor CURSOR FOR
SELECT
t.TABLE_NAME
FROM
information_schema.`TABLES` AS t
WHERE
t.TABLE_SCHEMA = DATABASE()
AND ( t.TABLE_NAME LIKE 'p%' OR t.TABLE_NAME LIKE 'r%' OR t.TABLE_NAME LIKE 's%' );
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;
SET FOREIGN_KEY_CHECKS = 0;
OPEN tname_cursor;
FETCH tname_cursor INTO tname;
WHILE done <> 1 do
SET @cmd = CONCAT('DELETE FROM ', tname);
PREPARE stmt FROM @cmd;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
FETCH tname_cursor INTO tname;
END WHILE;
CLOSE tname_cursor;
SET FOREIGN_KEY_CHECKS = 1;
END$$
DELIMITER ;
CALL Drop_Table();


之前的版本需要将查询结果复制出来再执行,就需要多做一个步骤。这个版本通过存储过程自动实现清空表的数据。用了游标和prepare两种手段。

批量删除指定字段

有时候几乎所有表中都有同一个字段需要删除,这时候就需要批量删除这个字段。下面以删除id这个字段为例。

mysql版

DROP PROCEDURE IF EXISTS Del_Column;
DELIMITER $$
CREATE PROCEDURE Del_Column(ColumnName VARCHAR(255))
BEGIN
DECLARE tname VARCHAR(64);
DECLARE done int default 0;
DECLARE tname_cursor CURSOR FOR
SELECT c.TABLE_NAME
FROM
information_schema.`Columns` AS c
WHERE
c.TABLE_SCHEMA = DATABASE()
AND c.COLUMN_NAME = ColumnName;

DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;

OPEN tname_cursor;
FETCH tname_cursor INTO tname;
WHILE done <> 1 do
SET @cmd = CONCAT('ALTER TABLE ', tname, ' DROP COLUMN ', ColumnName);
PREPARE stmt FROM @cmd;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
FETCH tname_cursor INTO tname;
END WHILE;
CLOSE tname_cursor;

END$$
DELIMITER ;
CALL Del_Column('id');


执行之后,表中只要存在id字段,这个就会被删除,没有id字段的表不受影响。

sqlserver版

语法和mysql不同,但是功能一样。

IF (OBJECT_ID('Del_Column', 'P') IS NOT NULL)
DROP PROC Del_Column
GO
CREATE PROC Del_Column(@ColumnName VARCHAR(255))
AS
DECLARE @tname VARCHAR(64)
DECLARE @cmd VARCHAR(500)
DECLARE tname_cursor CURSOR FOR
SELECT o.name as oname FROM syscolumns as c INNER JOIN sysobjects as o ON c.id = o.id
WHERE c.name = @ColumnName
BEGIN
OPEN tname_cursor
FETCH NEXT FROM tname_cursor INTO @tname
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC('ALTER TABLE ' + @tname + ' DROP COLUMN ' + @ColumnName)
FETCH NEXT from tname_cursor INTO @tname
END
CLOSE tname_cursor
DEALLOCATE tname_cursor
END
EXEC Del_Column 'id'
GO


下载地址:mss2sql 4.1版本
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: