36

非主キーを自動インクリメントすることは可能ですか?

テーブル「book_comments」

book_id     medium_int
timestamp   medium_int
user_id     medium_int
vote_up     small_int
vote_down   small_int
comment     text
comment_id  medium_int

Primary key -> (book_id, timestamp, user_id)

このテーブルには他のインデックスはありません。ただし、comment_id別のテーブルを簡単に作成できるように、列を自動インクリメントしたいと思います。

テーブル「book_comments_votes」

comment_id  (medium_int)
user_id     (medium_int)

Primary key -> (comment_id, user_id)

ユーザーは、本のコメントごとに 1 回だけ投票できます。このテーブルは、主キーによってこの規則を適用します。

質問:

テーブル「book_comments」の列を自動インクリメントするように、非主キーを自動インクリメントすることは可能ですか?comment_id


代替案、ディスカッション。

上記で説明したように、簡単にするためにこれを行いたいと思います。代替案は有望ではありません。

  • commnet_id PK を作成し、上で一意のインデックスを使用して整合性を確保しますbook_id, timestamp, user_id。この場合、追加のインデックスを作成します。
  • PK を保持し、comment_id をbook_comments_votesPK 全体に置き換えます。これにより、テーブルのサイズが 3 倍以上になります。

提案?考え?

4

3 に答える 3

50

はい、できます。その列をインデックスにするだけです。

CREATE TABLE `test` (
  `testID` int(11) NOT NULL,
  `string` varchar(45) DEFAULT NULL,
  `testInc` int(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`testID`),
  KEY `testInc` (`testInc`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;


insert into test(
  testID,
 string
)
values (
1,
    'Hello'
);


insert into test( 
testID,
 string
)
values (
2,
    'world'
);

「testInc」の自動インクリメント値を持つ行を挿入します。しかし、これは本当にばかげたことです。

あなたはすでにそれを行う正しい方法を言っています:

「comment_id PK を作成し、book_id、timestamp、user_id の一意のインデックスを通じて整合性を確保します。」

それはまさにあなたがやるべき方法です。将来のクエリで必要になるテーブルの適切な主キーを提供するだけでなく、最小の驚きの原則も満たします。

于 2012-12-30T02:12:09.110 に答える
1

既存のテーブルがあります。主キーをすでに与えていてcomment_id、唯一の目的が auto_increment を設定することである場合。その列に主キーをドロップできます。MySQL では、任意のキー プロパティを持つ列が auto_increment にアクセスできます。そのため、インデックスを試してみるか、以下unique keycomment_id気に入ってください。

1.主キーを削除する

ALTER TABLE `book_comments` MODIFY `comment_id` INT(5) NOT NULL;

ALTER TABLE `book_comments` DROP PRIMARY KEY ;
  1. プロパティで追加AUTO_INCREMENTUNIQUE_KEYます。

ALTER TABLE 'brand_keywords' CHANGE COLUMN 'comment_id' 'comment_id' INT(5) NOT NULL AUTO_INCREMENT UNIQUE;

于 2017-03-28T08:47:43.667 に答える
0

MySQL 5.5 の時点では、インデックスまたは主キーなしで INT フィールドを自動インクリメントで提供できるようです。

于 2014-03-13T06:55:48.923 に答える