web-dev-qa-db-ja.com

Mysql Innodb:非プライマリキーの自動インクリメント

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

テーブル「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を保持し、book_comments_votesのc​​omment_idをPK全体で置き換えます。これは、テーブルのサイズの3倍以上になります。

提案?考え?

29
ProfileTwist

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

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の一意のインデックスを使用して整合性を強制します。」

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

41
Danack

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

1.主キーの削除

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

ALTER TABLE `book_comments` DROP PRIMARY KEY ;
_
  1. _AUTO_INCREMENT_プロパティに_UNIQUE_KEY_を追加します。

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

1
Gowtham Vakani

MySQL 5.5の時点では、 インデックスまたは 主キー自動インクリメントで提供されるINTフィールド。

0
loebe