【问题标题】:How can I rewrite this MS SQL Script as a MySQL Script?如何将此 MS SQL 脚本重写为 MySQL 脚本?
【发布时间】:2011-04-17 11:55:27
【问题描述】:

我正在努力通过a 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);

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

有没有更好的写法?

【问题讨论】:

    标签: mysql sql-server constraints identity clustered-index


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      +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。

      【讨论】:

        猜你喜欢
        • 2011-12-10
        • 1970-01-01
        • 2010-11-26
        • 1970-01-01
        • 2023-02-04
        • 1970-01-01
        • 1970-01-01
        • 2022-11-24
        • 2012-09-18
        相关资源
        最近更新 更多