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)
Пользователи смогут голосовать только один раз за комментарий к книге. В этой таблице применяется это правило с помощью первичного ключа.
Вопрос:
Можно ли автоинкремент не первичного ключа - как и в, автоматически увеличивать столбец comment_id
в таблице "book_comments"?
Альтернативы, Обсуждение:
Я хотел бы сделать это для простоты, как описано выше. Альтернативы не являются многообещающими.
- Сделать commnet_id PK и обеспечить целостность с помощью уникального индекса на
book_id, timestamp, user_id
. В этом случае я бы создал дополнительный индекс.
- Сохраните PK и замените comment_id в
book_comments_votes
на весь ПК. Это более чем утроило бы размер таблицы.
Предложения? Мысли?
Ответы
Ответ 1
Да, вы можете. Вам просто нужно сделать этот столбец индексом.
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."
Именно так вы должны это делать. Он не только предоставляет вам правильный первичный ключ для таблицы, который вам понадобится для будущих запросов, но также удовлетворяет принцип наименьшего удивления.
Ответ 2
У вас есть таблица. Если вы уже дали первичный ключ 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;
Ответ 3
Как и в случае с MySQL 5.5, возможно, что без индекса или первичного ключа поле INT должно быть предоставлено с автоинкрементами.