2010-09-26 51 views
2

我正在努力通过a Java Tutorial如何将这个MS SQL脚本重写为MySQL脚本?

作者写了教程来使用MS SQL。我想遵循使用MySQL的教程。我不完全知道如何翻译它采用“身份”,“约束”的MS SQL脚本,“分组”,你会看到如下:

CREATE TABLE [event_person] (
    [event_id] [int] NOT NULL, 
    [person_id] [int] NOT NULL, 
    CONSTRAINT [PK_event_person] PRIMARY KEY CLUSTERED 
    (
    [event_id] ASC, 
    [person_id] ASC 
) 
) 

CREATE TABLE [events] (
    [id] [int] IDENTITY(1,1) NOT NULL, 
    [dt] [datetime] NULL, 
    [name] [nvarchar](50) NULL, 
    CONSTRAINT [PK_events] PRIMARY KEY CLUSTERED 
    (
    [id] ASC 
) 
) 

CREATE TABLE [people] (
    [id] [int] IDENTITY(1,1) NOT NULL, 
    [name] [varchar](50) NOT NULL, 
    CONSTRAINT [PK_people] PRIMARY KEY CLUSTERED 
    (
    [id] ASC 
) 
) 

这是据我已经能够得到它:

CREATE TABLE event_person (
    event_id int NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    person_id int NOT NULL 
); 

CREATE TABLE events (
    id int NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    dt datetime NULL, 
    name nvarchar(50) NOT NULL); 


CREATE TABLE people (
    id int NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    name nvarchar(50) NOT NULL); 

...但我担心的是,省略的代码将导致丢失的功能,甚至与本教程的其余部分不兼容。

有没有更好的方法我应该写这个?

回答

2

event_person表的主键在两个脚本中并不相同。 SQL Server示例使用由两个字段组成的组合主键。这并不在列规范中定义的,所以我们需要使用一个单独的PRIMARY KEY条款:

CREATE TABLE `event_person` (
    `event_id` int NOT NULL, 
    `person_id` int NOT NULL, 
    PRIMARY KEY (`event_id`, `person_id`) 
); 

还要注意,在MySQL中没有nvarchar数据类型。你可能会需要使用column character set

CREATE TABLE `events` (
    `id` int NOT NULL PRIMARY KEY AUTO_INCREMENT, 
    `dt` datetime, 
    `name` varchar(50) CHARACTER SET ucs2 
); 

另外,请注意,在上面的例子中,我们没有主键约束赋予名字。虽然这可能是无关紧要的,你可能想给名称如下:

CREATE TABLE `event_person` (
    `event_id` int NOT NULL, 
    `person_id` int NOT NULL, 
    CONSTRAINT `pk_event_person` PRIMARY KEY (`event_id`, `person_id`) 
); 

CREATE TABLE `events` (
    `id` int NOT NULL AUTO_INCREMENT, 
    `dt` datetime, 
    `name` varchar(50) CHARACTER SET ucs2, 
    CONSTRAINT `pk_ events ` PRIMARY KEY (`id`) 
); 
1

+1到@Daniel瓦萨洛的回答,以及这些提示:

  • 微软使用方括号来界定标识符而MySQL使用back-ticks。这两个数据库都可以放入使用ANSI SQL标准标识符分隔符(双引号)的模式中。在MySQL中,不要分隔数据类型名称(例如[int])。

  • IDENTITY特定于Microsoft(和Sybase,fwiw)。在MySQL中,使用AUTO_INCREMENT。您也可以使用简写为BIGINT UNSIGNED AUTO_INCREMENT的SERIAL。

  • 在MySQL中不支持CLUSTERED关键字。主键始终是MySQL的InnoDB存储引擎中的聚集索引(除非您有充分的理由,否则您应该使用该索引)。您也不需要在MySQL中为索引声明ASC或DESC。