Как я могу переписать этот MS SQL Script как MySQL Script? - PullRequest
2 голосов
/ 26 сентября 2010

Я пытаюсь пройти через Учебник по Java .

Автор написал учебник по работе с MS SQL. Я хотел бы следовать учебнику с использованием MySQL. Я не совсем уверен, как перевести скрипт MS SQL, который использует «IDENTITY», «CONSTRAINT» и «CLUSTERED», как вы увидите ниже:

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 ]

2 голосов
/ 26 сентября 2010

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

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 голос
/ 26 сентября 2010

+ 1 к ответу @Daniel Vassallo, а также следующие советы:

  • Microsoft использует квадратные скобки для разделения идентификаторов, тогда как MySQL использует обратные галочки. Обе базы данных могут быть переведены в режим использования стандартных идентификаторов ANSI SQL, которые заключаются в двойные кавычки. В MySQL не разделяйте имена типов данных (например, [int]).

  • IDENTITY является специфическим для Microsoft (и Sybase, fwiw). В MySQL используйте AUTO_INCREMENT. Вы также можете использовать SERIAL, что является сокращением для BIGINT UNSIGNED AUTO_INCREMENT.

  • В MySQL нет поддержки ключевого слова CLUSTERED. Первичный ключ всегда является кластеризованным индексом в механизме хранения InnoDB MySQL (который следует использовать, если у вас нет веских причин не делать этого). Также вам не нужно объявлять ASC или DESC для индексов в MySQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...