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

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

11 ответов


An ALTER TABLE оператор добавления PRIMARY KEY столбец работает правильно в моем тестировании:

ALTER TABLE tbl ADD id INT PRIMARY KEY AUTO_INCREMENT;

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


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

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

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

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

для таких, как я получаю Multiple primary key defined ошибка try:

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

на MySQL версии 5.5.31 это установить id столбец в качестве первичного ключа для меня и заполняется каждая строка с приращением стоимости.


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

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


самый простой и быстрый я нахожу это

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

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

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

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

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

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


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


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

ALTER TABLE mydb.mytable ADD pk_columnName INT IDENTITY 

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


ALTER TABLE tableName изменить tableNameID MEDIUMINT НЕ NULL типа AUTO_INCREMENT;

здесь tableName - имя таблицы,

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

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

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

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

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


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

эта таблица в настоящее время создана - количество найденных записей: 4 имя VARCHAR (20) да порода ВАРЧАР(30) да цвет VARCHAR (20) да вес SMALLINT (7) да

это конечный результат поиска (описание таблицы) -

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

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

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

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

$query = " ALTER TABLE racehorses ADD id INT NOT NULL AUTO_INCREMENT сначала добавьте первичный ключ (id)";

Как вам это? -

количество найденных записей: 4 имя VARCHAR (20) нет ПОИ порода ВАРЧАР(30) да цвет VARCHAR (20) да вес SMALLINT (7) да

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