代码之家  ›  专栏  ›  技术社区  ›  Peter Bailey

将MySQL DDL转换为SQL Server DDL

  •  1
  • Peter Bailey  · 技术社区  · 15 年前

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

    已经过去了 因为我和SQL Server搞混了,我想确保我能将这个脚本转换成兼容的。

    我真的不知道该找什么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;
    
    3 回复  |  直到 15 年前
        1
  •  3
  •   chryss    15 年前

    开始的一种方法是将DDL加载到MySQL数据库中,然后使用 mysqldump --compatible=mssql 重新转储它。这应该让您开始了——从那里开始,可能会浏览T-SQL文档,并逐个询问。

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

        2
  •  2
  •   sql_williamd    15 年前

    彼得,

    这里需要考虑MySQL和MSSQL之间的一些差异,特别是模式。我不太确定它们是如何与MySQL一起工作的,但它看起来就像MSSQL自己调用的数据库。

    MSSQL中的模式更像是一个安全抽象层,用于对数据库中的对象进行分组。这是一个没有被大量使用的阿法克,但一些东西,女士想促进。我把它放在这里,然后在默认模式(通常是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) 
    

    请注意以下更改:

    • 自动增量交换 为了身份。指定起始值和增量
    • MSSQL不具有有符号或无符号整数的概念
    • 默认情况下,主键将创建为聚集索引。
    • 除非指定,否则索引将创建为非唯一和非聚集索引。

    columnname“text”是一个保留关键字,也应该更改,以停止任何分析问题。

    希望有帮助。

        3
  •  0
  •   Brian Swan    15 年前

    另一种可能性(如果您可以访问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的向导…它工作得很好。

    -布瑞恩

    推荐文章