#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. Проголосовал против. Это не решает вопрос, и требование получить идентификатор и добавить его к нему — плохая идея. При загруженном приложении вы можете получить дубликаты.