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、2 つのスクリプトで同等ではありません。SQL Server の例では、2 つのフィールドで構成される複合主キーを使用しています。これは列仕様では定義できないため、別のPRIMARY KEY句を使用する必要があります。

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

nvarcharまた、MySQL にはデータ型がないことに注意してください。列の文字セットを使用する必要があります:

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

@Daniel Vassalloの回答に+1し、これらのヒントも:

  • Microsoft は角かっこを使用して識別子を区切りますが、MySQL はバックティックを使用します。両方のデータベースを、二重引用符である ANSI SQL 標準の識別子区切り文字を使用するモードにすることができます。MySQL では、データ型名を区切らないでください (例: [int])。

  • IDENTITY は、Microsoft (および Sybase、fwiw) に固有のものです。MySQL では、AUTO_INCREMENT を使用します。BIGINT UNSIGNED AUTO_INCREMENT の短縮形である SERIAL を使用することもできます。

  • MySQL では CLUSTERED キーワードはサポートされていません。プライマリ キーは常に、MySQL の InnoDB ストレージ エンジンのクラスター化されたインデックスです (使用しない正当な理由がない限り、これを使用する必要があります)。また、MySQL のインデックスに対して ASC または DESC を宣言する必要はありません。

于 2010-09-26T19:52:18.907 に答える