2

我正在尝试通过Java Tutorial进行工作。

作者编写了使用 MS SQL 的教程。我想按照使用 MySQL 的教程进行操作。我不完全确定如何翻译使用“IDENTITY”、“CONSTRAINT”和“CLUSTERED”的 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);

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

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

4

2 回答 2

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数据类型。您需要使用列字符集

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`)
);
于 2010-09-26T19:23:06.480 回答
1

+1 @Daniel Vassallo 的回答,还有这些提示:

  • Microsoft 使用方括号来分隔标识符,而 MySQL 使用反引号。两个数据库都可以设置为使用 ANSI SQL 标准标识符分隔符的模式,这些分隔符是双引号。在 MySQL 中,不要分隔数据类型名称(例如[int])。

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

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

于 2010-09-26T19:52:18.907 回答