Добавьте столбец автоматического увеличения, который не является первичным ключом SQL

#mysql #sql

#mysql #sql

Вопрос:

У меня есть таблица, которая отслеживает файлы на диске. У меня есть путь к файлу, установленный в качестве первичного ключа, так как это уникальная часть данных. Я хочу добавить новый столбец с автоматическим увеличением, но НЕ первичный ключ. Можно ли это сделать? Я хочу, чтобы этот столбец позволял мне получать доступ к данным с идентификатором, а не с большой длинной строкой пути к файлу.

 ALTER TABLE `Media`  ADD `ID` INT NOT NULL AUTO_INCREMENT

#1075 - Incorrect table definition; there can be only one auto column and it must be defined as a key
  

Комментарии:

1. Как указано в ошибке, у вас не может быть двух столбцов АВТОИНКРЕМЕНТА в одной таблице. Вы можете изменить свой запрос, чтобы предоставить вам добавочный идентификатор, хотя

2. однако столбца с автоматическим увеличением нет. Существует первичный ключ, но не столбец ID, который мне нужен.

3. Вы также можете удалить первичный ключ, добавить столбец auto_increment, а затем создать уникальный индекс в пути к файлу.

Ответ №1:

Измените структуру таблицы таким образом, чтобы путь к файлу был объявлен как unique вместо primary . Затем добавьте автоматически увеличивающийся первичный ключ.

 ALTER TABLE `Media` DROP PRIMARY KEY, 
  ADD UNIQUE KEY (`FilePath`), 
  ADD `ID` INT AUTO_INCREMENT FIRST, 
  ADD PRIMARY KEY (`ID`);
  

Есть преимущества в том, чтобы иметь целочисленный первичный ключ вместо строки. Например, вторичный индекс будет использовать первичный ключ для доступа к строке, поэтому наличие полного пути к файлу просто делает индекс больше, чем он должен быть.

Комментарии:

1. Надеюсь, вы не возражаете, я добавил синтаксис, чтобы внести описанные вами изменения.

2. @BillKarwin . . . Большое вам спасибо.

Ответ №2:

 ALTER TABLE
        `Media`
ADD     `ID` INT NOT NULL UNIQUE AUTO_INCREMENT
  

Комментарии:

1. именно то, что я хотел. Я согласен с комментарием выше, в котором говорится, что нужно удалить текущий pk и сделать путь к файлу уникальным. в данный момент я нахожусь под давлением, поэтому мне нужно просто заставить его работать

2. Для выполнения этого требуется меньше времени, чем для выполнения этого дважды.

Ответ №3:

вы должны вставить строки, подобные этой :

 SET @ID = 0;

INSERT INTO Media  (ID,  SomeColumn) VALUES  (@ID := @ID   1, 'Some Text');
  

Комментарии:

1. Проголосовал против. Это не решает вопрос, и требование получить идентификатор и добавить его к нему — плохая идея. При загруженном приложении вы можете получить дубликаты.