将MySQL DDL转换为SQL Server DDL

问题描述 投票:1回答:4

我有一个为MySQL 5生成的模型,但现在我需要在SQL Server安装上创建这些表。

自从使用SQL Server以来,已经有[[years年,我想确保可以转换此脚本以使其兼容。

我真的不知道该寻找TBQH,所以事不宜迟,这是我的MySQL DDL

CREATE SCHEMA IF NOT EXISTS `bof_survey` DEFAULT CHARACTER SET utf8 COLLATE default collation ; USE `bof_survey`; -- ----------------------------------------------------- -- Table `bof_survey`.`question` -- ----------------------------------------------------- CREATE TABLE IF NOT EXISTS `bof_survey`.`question` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT , `text` VARCHAR(255) NOT NULL , PRIMARY KEY (`id`) ) ENGINE = InnoDB; -- ----------------------------------------------------- -- Table `bof_survey`.`category` -- ----------------------------------------------------- CREATE TABLE IF NOT EXISTS `bof_survey`.`category` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT , `name` VARCHAR(45) NOT NULL , `adverb` VARCHAR(45) NOT NULL , PRIMARY KEY (`id`) ) ENGINE = InnoDB; -- ----------------------------------------------------- -- Table `bof_survey`.`answer` -- ----------------------------------------------------- CREATE TABLE IF NOT EXISTS `bof_survey`.`answer` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT , `question_id` INT UNSIGNED NULL , `category_id` INT UNSIGNED NULL , `text` VARCHAR(60) NULL , PRIMARY KEY (`id`) , INDEX `fk_answer_question` (`question_id` ASC) , INDEX `fk_answer_category1` (`category_id` ASC) , CONSTRAINT `fk_answer_question` FOREIGN KEY (`question_id` ) REFERENCES `bof_survey`.`question` (`id` ) ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT `fk_answer_category1` FOREIGN KEY (`category_id` ) REFERENCES `bof_survey`.`category` (`id` ) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB;

mysql sql-server ddl
4个回答
3
投票
一种入门方法是将DDL加载到MySQL数据库中,然后使用mysqldump --compatible=mssql重新转储它。这应该可以帮助您入门-从那里开始,可能要遍历T-SQL文档,并逐案询问。

此外,Microsoft还有一些资源,例如this article(用于SQL Server 2000,但它可以帮助正确映射数据类型)。


2
投票
彼得,

您需要在此处考虑MySQL和MSSQL之间的某些差异,尤其是架构。我不太确定它们如何与MySQL一起使用,但似乎几乎像MSSQL本身所称的数据库。

MSSQL中的模式更多是安全性抽象层,用于对数据库内的对象进行分组。 AFAIK并没有大量使用它,但是MS希望推广它。我在这里省略了它,然后在默认模式(通常是dbo)中创建对象。

不用说,其余的很简单:

-- ----------------------------------------------------- -- Table question -- ----------------------------------------------------- IF NOT EXISTS ( SELECT * FROM sys.objects WHERE name = 'question' ) BEGIN CREATE TABLE question (id int IDENTITY(1, 1) NOT NULL, text varchar(255) NOT NULL, PRIMARY KEY (id)) ; END -- ----------------------------------------------------- -- Table category -- ----------------------------------------------------- IF NOT EXISTS ( SELECT * FROM sys.objects WHERE name = 'category' ) CREATE TABLE category (id int IDENTITY(1, 1) NOT NULL, name varchar(45) NOT NULL, adverb varchar(45) NOT NULL, PRIMARY KEY (Id)) ; -- ----------------------------------------------------- -- Table answer -- ----------------------------------------------------- IF NOT EXISTS ( SELECT * FROM sys.objects WHERE name = 'answer' ) CREATE TABLE answer (id int IDENTITY(1, 1) NOT NULL, question_id int NULL, category_id int NULL, text varchar(60) NULL PRIMARY KEY (Id), CONSTRAINT fk_answer_question FOREIGN KEY (question_id) REFERENCES question (id) ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT fk_answer_category1 FOREIGN KEY (category_id) REFERENCES category (id) ON DELETE NO ACTION ON UPDATE NO ACTION); CREATE INDEX fk_answer_question ON answer(question_id ASC) CREATE INDEX fk_answer_category1 ON answer(category_id ASC)

请注意以下更改:

    AUTO_INCREMENT被交换身份。您指定起始值和增量
  • MSSQL没有SIGNED或UNSIGNED整数的概念
  • 默认情况下,主键将被创建为聚簇索引
  • 除非指定,否则索引将创建为非唯一且非聚集的索引
  • columnname'text'是保留的关键字,也应该更改,以阻止任何解析问题。

    希望有所帮助。


  • 0
    投票
    另一种可能性(如果可以访问MySQL数据库本身,而不是DDL,则可以使用Microsoft发布的迁移向导:

    用于迁移到SQL Server 2008:http://www.microsoft.com/downloads/details.aspx?FamilyID=0e6168b0-2d0c-4076-96c2-60bd25294a8e&displaylang=en

    用于迁移到SQL Server 2005:http://www.microsoft.com/downloads/details.aspx?FamilyID=c6f14640-da22-4604-aaaa-a45de4a0cd4a&displaylang=en

    我已使用SQL Server 2008的向导...它运行良好。

    -布莱恩


    0
    投票
    我正在将DDL从MySQL Server 5.7.12导出到SQL Server 12.00.6024中,并发现了以下内容:

      [当我从MySQL导出DDL时,列名用反斜线括起来,例如`my_column_name`,但是当我从SQL Server导出时,列名用方括号[my_column_name]括起来。
  • 我先在所有后勾上进行文本搜索,然后用左括号([)替换,然后在左括号中搜索以空格([),然后在右括号中替换为空格, (]),然后在左括号后用逗号([,)进行搜索,然后用右括号后用逗号(],)进行替换,依此类推。

    1. MySQL使用关键字KEY表示INDEX。由于确实存在实际的PRIMARY KEYFOREIGN KEY,因此我不得不手动检查脚本并进行替换。
    2. MySQL导出类型为bigint(20)的列。我将其更改为bigint
    3. 我将CHARACTER SET latin1更改为COLLATE latin1
    4. 我将double更改为float(53)
    5. 我在创建表UNIQUE KEY [NAME] ([NAME]),之后删除了ALTER TABLE [my_table] ADD CONSTRAINT UNQ_NAME UNIQUE([NAME])并创建了一条alter语句。
  • © www.soinside.com 2019 - 2024. All rights reserved.