欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-09 17:34:46
...

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


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


sqlserver至mysql的数据迁移

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

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


2.直接点击下一步
sqlserver至mysql的数据迁移,批量清空数据和批量删除指定字段
3.填写sqlserver的连接地址和身份验证,点下一步
sqlserver至mysql的数据迁移,批量清空数据和批量删除指定字段
4.填写mysql的连接地址,一般选择远程连接(Remote),mysql默认端口号为3306
sqlserver至mysql的数据迁移,批量清空数据和批量删除指定字段
5.上方选择要导出的sqlserver的数据库,下方自行填写导出到mysql的数据库,右侧第一个勾选框表示只导出数据库结构定义,不导出数据,第二个表示跳过索引的转换。一般都不勾选。点下一步。
sqlserver至mysql的数据迁移,批量清空数据和批量删除指定字段
6. 可能会弹出警告框,这是因为要导出到mysql的数据库已经存在了。四个选项第一个是覆盖整个数据库,第二个是仅仅覆盖已存在的表,第三个是跳过已存在的表,第四个是合并冲突的表。根据情况自行选择。
sqlserver至mysql的数据迁移,批量清空数据和批量删除指定字段
7.出现了sqlserver里所有的表名,选择add all将所有的表都导出到mysql,也可以选择某几张表进行导出。可以点击add query添加自定义的sql query。点下一步就开始转换,等待片刻就完成了。
sqlserver至mysql的数据迁移,批量清空数据和批量删除指定字段

批量清空表数据

 除了数据迁移之外,还需要批量清空表的数据,并且有一部分表的数据需要保留,并不是所有表都要清空。下面直接给出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
    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版本