非プライマリキーを自動インクリメントすることは可能ですか?
テーブル「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
列を自動インクリメントしますか?
代替案、議論:
上記で説明したように、簡単にするためにこれを行いたいと思います。代替案は有望ではありません。
book_id, timestamp, user_id
の一意のインデックスを使用して整合性を強制します。この場合、追加のインデックスを作成します。book_comments_votes
のcomment_idをPK全体で置き換えます。これは、テーブルのサイズの3倍以上になります。提案?考え?
はい、できます。その列をインデックスにするだけです。
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の一意のインデックスを使用して整合性を強制します。」
それはまさにあなたがそれをしているべき方法です。将来のクエリに必要となるテーブルの適切な主キーを提供するだけでなく、 最小の驚きの原則 を満たします。
既存のテーブルがあります。すでに_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 ;
_
AUTO_INCREMENT
_プロパティに_UNIQUE_KEY
_を追加します。ALTER TABLE 'brand_keywords' CHANGE COLUMN 'comment_id' 'comment_id' INT(5) NOT NULL AUTO_INCREMENT UNIQUE;
MySQL 5.5の時点では、 インデックスまたは 主キー自動インクリメントで提供されるINTフィールド。