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

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

Ответ 1

Оператор ALTER TABLE, добавляющий столбец PRIMARY KEY, работает правильно в моем тестировании:

ALTER TABLE tbl ADD id INT PRIMARY KEY AUTO_INCREMENT;

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

Ответ 2

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

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

Ответ 3

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

$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

Самое легкое и быстрое, что я нахожу, это

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

Ответ 5

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

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

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

Ответ 6

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

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, а затем перестроить их позже. Но пока я хотел поделиться этим решением с более сложной версией исходного вопроса, если другие столкнулись с этой ситуацией.

Ответ 7

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

Ответ 8

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

ALTER TABLE mydb.mytable ADD pk_columnName INT IDENTITY 

Ответ 9

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

Ответ 10

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

Эта таблица в настоящее время создана - Количество найденных записей: 4 name VARCHAR (20) YES породы VARCHAR (30) ДА цвет VARCHAR (20) ДА вес SMALLINT (7) ДА

Это искомый конечный результат (ОПИСАНИЕ ТАБЛИЦЫ) -

Количество найденных записей: 4 имя VARCHAR (20) NO PRI породы VARCHAR (30) ДА цвет VARCHAR (20) ДА вес SMALLINT (7) ДА

Вместо этого -

Количество найденных записей: 5 id int (11) NO PRI имя VARCHAR (20) ДА породы VARCHAR (30) ДА цвет VARCHAR (20) ДА вес SMALLINT (7) ДА

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

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

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

Количество найденных записей: 4 имя VARCHAR (20) NO PRI породы VARCHAR (30) ДА цвет VARCHAR (20) ДА вес SMALLINT (7) ДА

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