2010-09-26 33 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。