Вставить автоинкрементный первичный ключ в существующую таблицу


157

Я пытаюсь изменить таблицу, в которой нет ни первичного ключа, ни столбца auto_increment. Я знаю, как добавить столбец первичного ключа, но мне было интересно, можно ли автоматически вставить данные в столбец первичного ключа (у меня уже есть 500 строк в БД и я хочу дать им идентификатор, но я не хочу делать это вручную) , Есть предположения? Большое спасибо.


2
Вы можете легко сделать, alter tableчтобы добавить ключ, но MySQL не будет генерировать идентификаторы для полей, у которых их еще нет. Вам нужно будет вручную обновить существующие поля, а затем убедиться, что ваш новый auto_increment начинается с правого смещения - по умолчанию он равен «1», и в любом случае вы просто получите ошибки дублирующихся ключей.
Марк Б

3
@MarcB Я только что проверил, и он фактически вставил идентификаторы для существующих строк, начиная с 1
Майкл Берковски

Ответы:


253

ALTER TABLEЗаявление добавления PRIMARY KEYколонки корректно работает в моем тестировании:

ALTER TABLE tbl ADD id INT PRIMARY KEY AUTO_INCREMENT;

Во временной таблице, созданной для целей тестирования, вышеприведенный оператор создал AUTO_INCREMENT idстолбец и вставил значения автоинкремента для каждой существующей строки в таблице, начиная с 1.


1
Да, это был мой опыт. Никогда не вспоминайте о необходимости запуска отдельного скрипта для заполнения идентификаторов auto_increment ...
Майк Перселл

1
лол спасибо. моя вина. Зеленый знак для вас, так как ваш легче реализовать. : D
FlyingCat

53
Чтобы сделать это первым столбцом, используйте, FIRSTнапример,ALTER TABLE tbl1 ADD id INT PRIMARY KEY AUTO_INCREMENT FIRST;
Дэвид Томас

1
@Nikkie Механика SQLite совершенно иная. Вы найдете предложения здесь stackoverflow.com/questions/946011/sqlite-add-primary-key
Майкл Берковски

1
@WijaySharma Если вы создали строку с автоинкрементом и должны немедленно извлечь ее по id, MySQL предлагает LAST_INSERT_ID()для этого значения, SELECT * FROM table_name WHERE id = LAST_INSERT_ID()и большинство API-интерфейсов языка программирования предлагают некоторую функцию / метод для возврата этого значения в код приложения.
Майкл Берковски

51

Предположим, у вас нет столбца для автоинкремента, такого как id, нет, тогда вы можете добавить, используя следующий запрос:

ALTER TABLE table_name ADD id int NOT NULL AUTO_INCREMENT primary key FIRST

Если у вас есть столбец, то перейдите к автоматическому приращению, используя следующий запрос:

 ALTER TABLE table_name MODIFY column_name datatype(length) AUTO_INCREMENT PRIMARY KEY

1
Что делает FIRSTв конце делает?
Дементик

1
Это сделает новый idстолбец первым в таблице, а не последним, что является поведением по умолчанию.
Фмалина

Работает хорошо! Спасибо!
Маджедур Рахаман

4

да, что-то вроде этого сделало бы это, может быть, не самое лучшее, вы можете сделать резервную копию

$get_query = mysql_query("SELECT `any_field` FROM `your_table`");

$auto_increment_id = 1;

while($row = mysql_fetch_assoc($get_query))
{
  $update_query = mysql_query("UPDATE `your_table` SET `auto_increment_id`=$auto_increment_id WHERE `any_field` = '".$row['any_field']."'");
  $auto_increment_id++;
}

обратите внимание, что any_fieldвыбранный вами при обновлении должен быть одинаковым.


4

Для таких, как я, получаю Multiple primary key definedошибку, попробуйте:

ALTER TABLE `myTable` ADD COLUMN `id` INT AUTO_INCREMENT UNIQUE FIRST NOT NULL;

На MySQL v5.5.31 это установило idстолбец как первичный ключ для меня и заполнило каждую строку возрастающим значением.


2

Самый простой и быстрый способ найти это

ALTER TABLE mydb.mytable 
ADD COLUMN mycolumnname INT NOT NULL AUTO_INCREMENT AFTER updated,
ADD UNIQUE INDEX mycolumnname_UNIQUE (mycolumname ASC);

2

Мне удалось адаптировать эти инструкции, взять таблицу с существующим первичным ключом без инкремента, добавить добавочный первичный ключ в таблицу и создать новый составной первичный ключ со старым и новым ключами в качестве составного первичного ключа, используя следующие код:

DROP TABLE  IF EXISTS SAKAI_USER_ID_MAP;

CREATE TABLE SAKAI_USER_ID_MAP (
       USER_ID             VARCHAR (99) NOT NULL,
       EID                 VARCHAR (255) NOT NULL,
       PRIMARY KEY (USER_ID)
);

INSERT INTO SAKAI_USER_ID_MAP VALUES ('admin', 'admin');
INSERT INTO SAKAI_USER_ID_MAP VALUES ('postmaster', 'postmaster');

ALTER TABLE  SAKAI_USER_ID_MAP 
  DROP PRIMARY KEY, 
  ADD _USER_ID INT AUTO_INCREMENT NOT NULL FIRST, 
  ADD PRIMARY KEY ( _USER_ID, USER_ID );

Когда это сделано, поле _USER_ID существует и содержит все числовые значения для первичного ключа в точности так, как вы ожидаете. С «DROP TABLE» вверху вы можете запускать это снова и снова, чтобы экспериментировать с вариациями.

То, что я не смог заставить работать, - это ситуация, когда есть входящие FOREIGN KEY, которые уже указывают на поле USER_ID. Я получаю это сообщение, когда пытаюсь сделать более сложный пример с входящим внешним ключом из другой таблицы.

#1025 - Error on rename of './zap/#sql-da07_6d' to './zap/SAKAI_USER_ID_MAP' (errno: 150)

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


0

Экспортируйте свою таблицу, затем очистите таблицу, затем добавьте поле как уникальный INT, затем измените его на AUTO_INCREMENT, затем снова импортируйте таблицу, которую вы экспортировали ранее.


0

Вы можете добавить новый столбец первичного ключа к существующей таблице, которая может иметь порядковые номера, используя команду:

ALTER TABLE mydb.mytable ADD pk_columnName INT IDENTITY 

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IDENTITY' at line 1
user1717828

0

Я столкнулся с той же проблемой, поэтому я удалил поле для первичного ключа, затем воссоздал его и удостоверился, что он автоматически увеличивается. Это сработало для меня. Я надеюсь, что это помогает другим


0

ALTER TABLE tableName MODIFY tableNameID MEDIUMINT NOT NULL AUTO_INCREMENT ;

Здесь tableName - это имя вашей таблицы,

tableName - это имя вашего столбца, который должен быть изменен.

MEDIUMINT - это тип данных вашего существующего первичного ключа

AUTO_INCREMENT вы должны добавить только auto_increment после не нуль

Это сделает этот первичный ключ auto_increment ......

Надеюсь, это полезно :)


1
Было бы полезно, если вы отредактируете и добавите некоторые пояснения.
Шашант

-1

Как написать PHP, чтобы изменить уже существующее поле (имя, в этом примере), чтобы сделать его первичным ключом? Конечно, без добавления каких-либо дополнительных полей 'id' в таблицу.

Эта таблица в настоящее время создана - Количество записей найдено: 4 название VARCHAR (20) ДА порода VARCHAR (30) ДА окрас VARCHAR (20) ДА вес МАЛЕНЬКИЙ (7) ДА

Это конечный результат, который требуется (ТАБЛИЦА ОПИСАНИЯ) -

Количество найденных записей: 4 Название VARCHAR (20) NO PRI породы VARCHAR (30) YES окрас VARCHAR (20) YES вес SMALLINT (7) YES

Вместо того, чтобы получить это -

Количество найденных записей: 5 id int (11) НЕТ ПРИ ИМЕНИ VARCHAR (20) ДА породы VARCHAR (30) ДА окрас VARCHAR (20) ДА вес МАЛЕНЬКИЙ (7) ДА

после попытки ..

$ query = "ALTER TABLE скаковых лошадей ADD id INT NOT NULL AUTO_INCREMENT FIRST, ADD PRIMARY KEY (id)";

Как это получить? -

Количество найденных записей: 4 Название VARCHAR (20) NO PRI породы VARCHAR (30) YES окрас VARCHAR (20) YES вес SMALLINT (7) YES

т.е. INSERT / ADD .. и т. д. первичный ключ INTO первой записи поля (без добавления дополнительного поля 'id', как указано ранее.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.