Подтвердить что ты не робот

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 на весь ПК. Это более чем утроило бы размер таблицы.

Предложения? Мысли?

4b9b3361

Ответ 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 ;
  1. Добавить 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 должно быть предоставлено с автоинкрементами.