2010-09-26 5 views
2

Je suis en train de me frayer un chemin à travers a Java Tutorial.Comment puis-je réécrire ce script MS SQL en tant que script MySQL?

L'auteur a écrit le tutoriel pour travailler avec MS SQL. Je voudrais suivre le tutoriel en utilisant MySQL. Je ne suis pas tout à fait sûr de savoir comment traduire le script MS SQL qui utilise le terme « identité », « CONTRAINTE » et « CLUSTERED » comme vous le verrez ci-dessous:

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 
) 
) 

Ceci est aussi loin que je suis en mesure pour obtenir avec elle:

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); 

... mais je crains que le code omis entraînera la fonctionnalité perdue et même incompatibilité avec le reste du tutoriel.

Y at-il une meilleure façon que je devrais écrire cela?

Répondre

2

Les clés primaires pour les event_person tables ne sont pas équivalents dans les deux scripts. L'exemple SQL Server utilise une clé primaire composite composée de deux champs. Cela ne peut pas être définie dans la spécification de la colonne, nous avons donc besoin d'utiliser une clause PRIMARY KEY distincte:

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

Notez également qu'il n'y a pas de type de données nvarchar dans MySQL. Vous devez utiliser un column character set:

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

En outre, notez que dans l'exemple ci-dessus, nous n'avons pas donné des noms aux contraintes de clé primaire. Bien que ce soit probablement hors de propos, vous voudrez peut-être donner des noms comme suit:

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 à la réponse de @ Daniel Vassallo, et aussi ces conseils:

  • Microsoft utilise des crochets pour délimiter les identificateurs, alors que MySQL utilise des back-ticks. Les deux bases de données peuvent être mises en mode d'utilisation des délimiteurs d'identificateur standard ANSI SQL, qui sont des guillemets. Dans MySQL, ne délimitez pas les noms de type de données (par exemple, [int]).

  • IDENTITÉ est spécifique à Microsoft (et Sybase, FWIW). En MySQL, utilisez AUTO_INCREMENT. Vous pouvez également utiliser SERIAL qui est un raccourci pour BIGINT UNSIGNED AUTO_INCREMENT.

  • Il n'y a pas de soutien pour un mot-clé dans MySQL CLUSTERED. La clé primaire est toujours un index clusterisé dans le moteur de stockage InnoDB de MySQL (que vous devez utiliser sauf si vous avez une bonne raison de ne pas le faire). De même, vous n'avez pas besoin de déclarer ASC ou DESC pour les index dans MySQL.

Questions connexes