Преобразование MySQL DDL в SQL Server DDL - PullRequest
1 голос
/ 21 июля 2010

У меня есть модель, сгенерированная для MySQL 5, но теперь мне нужно создать эти таблицы при установке SQL Server.

Прошло года с тех пор, как я взломал SQL-сервер, и я хочу убедиться, что могу преобразовать этот скрипт в совместимый.

Я действительно не знаю, что искать 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 ]

3 голосов
/ 21 июля 2010

Один из способов начать работу - загрузить DDL в базу данных MySQL, а затем использовать mysqldump --compatible=mssql для повторной выгрузки.Это должно помочь вам начать - и с этого момента он может просматривать документы T-SQL и спрашивать здесь в каждом конкретном случае.

Кроме того, у Microsoft есть некоторые ресурсы, такие как1004 * эта статья (для SQL Server 2000, но это может помочь правильно сопоставить типы данных).

2 голосов
/ 21 июля 2010

Питер,

Есть некоторые различия между 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 не имеет понятия подписанные или неподписанные целые числа
  • Первичный ключ будет создан как кластеризованный индекс по умолчанию
  • Индексы будут создаваться как неуникальные и не кластеризованные, если не указано

Имя столбца 'text' является зарезервированным ключевым словом и также должно быть изменено, чтобы избежать проблем с анализом.

Надеюсь, это поможет.

0 голосов
/ 23 июля 2010

Другая возможность (если у вас есть доступ к самой базе данных 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 ... он хорошо работает.

-Брайан

...