将 MySQL DDL 转换为 SQL Server DDL
我有一个为 MySQL 5 生成的模型,但现在我需要在 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;
I have a model that was generated for MySQL 5 but now I need to create these tables on a SQL Server installation.
It's been years since I mucked with SQL server and I want to make sure I can convert this script to be compatible.
I don't really know what to look for TBQH, so without further ado, here's my 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;
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
一种开始方法是将 DDL 加载到 MySQL 数据库中,然后使用 mysqldump --兼容=mssql 重新转储它。这应该可以帮助您开始——从那里开始,您可能会浏览 T-SQL 文档,并根据具体情况在此处询问。
另外,微软还有一些资源,比如这篇文章(针对SQL Server 2000,但它可以帮助正确映射数据类型)。
One way of getting started is to load your DDL into a MySQL database and then use
mysqldump --compatible=mssql
to re-dump it. That should get you started -- and from there on it may be going through the T-SQL docs and asking here on a case-by-case basis.In addition, Microsoft has some resources, such as this article (for SQL Server 2000, but it could help mapping the data types correctly).
Peter,
您需要考虑 MySQL 和 MSSQL 之间的一些差异,尤其是模式。我不太清楚它们如何与 MySQL 一起工作,但它似乎几乎就像 MSSQL 本身所说的数据库一样。
MSSQL 中的模式更多的是一个安全抽象层,用于对数据库内的对象进行分组。 AFAIK 并没有大量使用它,但 MS 希望推广它。我在这里省略了它,然后在默认模式(通常是 dbo)中创建对象。
不用说,其余部分非常简单:
请注意以下更改:
为了身份。您指定起始值和增量
列名“text”为保留关键字,也应该更改,以阻止任何解析问题。
希望有帮助。
Peter,
there are some differences between MySQL and MSSQL that you need to consider here, especially schemas. I am not too sure how they work with MySQL, but it seems to be almost like what MSSQL calls a database in its own right.
A schema in MSSQL is more a security abstraction layer and used to group objects inside a database. It is something that is not greatly used AFAIK, but something that MS would like to promote. I have left it out here, and the objects are then created in the default schema (normally dbo).
Needless to say, the rest is quite straight forward:
Please note the following changes:
for IDENTITY. You specify the start value and the increment
The columnname 'text' is a reserved keyword and should be changed too, to stop any parsing problems.
Hope that helps.
另一种可能性(如果您有权访问 MySQL 数据库本身,而不是 DDL)是使用 Microsoft 发布的迁移向导:
对于迁移到 SQL Server 2008: com/downloads/details.aspx?FamilyID=0e6168b0-2d0c-4076-96c2-60bd25294a8e&displaylang=en" rel="nofollow noreferrer">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 的向导...它运行良好。
-布莱恩
Another possibility (if you have access to the MySQL database itself, as opposed to the DDL) is to use the migration wizard that Microsoft has released:
For migrating to SQL Server 2008: http://www.microsoft.com/downloads/details.aspx?FamilyID=0e6168b0-2d0c-4076-96c2-60bd25294a8e&displaylang=en
For migrating to SQL Server 2005: http://www.microsoft.com/downloads/details.aspx?FamilyID=c6f14640-da22-4604-aaaa-a45de4a0cd4a&displaylang=en
I've used the wizard for SQL Server 2008...it works well.
-Brian
我正在将 DDL 从 MySQL Server 版本 5.7.12 导出到 SQL Server 版本 12.00.6024,并发现以下内容:
`my_column_name`
但当我从 SQL Server 导出时,列名会被括号[my_column_name]
括起来。我通过首先对所有反勾号进行文本搜索并将其替换为左括号 ([),然后对左括号进行搜索,后跟一个空格 ([),并将它们替换为右括号,后跟一个空格 (],从而解决了这个问题),然后搜索左括号,后跟逗号 ([,),并将其替换为右括号,后跟逗号 (],),依此类推。
MySQL 使用关键字
KEY
,它的意思是INDEX
。由于还识别了实际的PRIMARY KEY
和FOREIGN KEY
,因此我必须手动检查脚本并替换。MySQL 导出类型为
bigint(20)
的列。我将它们更改为bigint
我将
CHARACTER SET latin1
更改为COLLATE latin1
我将
double
更改为float(53)
。我删除了
UNIQUE KEY [NAME] ([NAME]),
并在创建表后创建了一条alter语句ALTER TABLE [my_table] ADD CONSTRAINT UNQ_NAME UNIQUE([NAME])< /code>。
I am exporting DDL from MySQL Server version 5.7.12 into SQL Server version 12.00.6024 and have discovered the following:
`my_column_name`
but when I export from SQL Server, the column names are surrounded by brackets[my_column_name]
.I got around this by first doing a text search on all back ticks and replacing them with left brackets ([), then doing a search on left brackets followed by a space ([ ) and replacing them with right brackets followed by a space (] ), then doing a search on left brackets followed by a comma ([,) and replacing them with right brackets followed by a comma (],) and so forth.
MySQL uses the keyword
KEY
where it meansINDEX
. Since there are actualPRIMARY KEY
andFOREIGN KEY
also identified, I had to manually go through the script and replace.MySQL exported columns with type
bigint(20)
. I changed these tobigint
I changed
CHARACTER SET latin1
toCOLLATE latin1
I changed
double
tofloat(53)
.I removed
UNIQUE KEY [NAME] ([NAME]),
and created an alter statement after the table creationALTER TABLE [my_table] ADD CONSTRAINT UNQ_NAME UNIQUE([NAME])
.在导出所有表定义两次后,我放弃了,只是用 Python 编写了代码。
After exporting all the table definitions twice, I gave up and just coded the thing in Python.