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


157

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


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

3
@MarcB Я щойно тестував, і він фактично вставив ідентифікатори для існуючих рядків, починаючи з 1
Michael Berkowski

Відповіді:


253

ALTER TABLEЗаява додавання PRIMARY KEYколонки коректно працює в моєму тестуванні:

ALTER TABLE tbl ADD id INT PRIMARY KEY AUTO_INCREMENT;

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


1
Так, це був мій досвід. Ніколи не пам’ятайте, щоб запустити окремий сценарій, щоб заповнити ідентифікатори auto_increment ...
Майк Перселл

1
lol .. Дякую моє ліжко. Зелена позначка - це для вас, оскільки ваш спосіб легше реалізувати. : 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
Michael Berkowski

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стовпець першим у таблиці на відміну від останнього, що є поведінкою за замовчуванням.
fmalina

Добре працює! Дякую!
Majedur Rahaman

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 існує і містить усі значення числа для первинного ключа саме так, як ви очікували. З "СТОЛОМ ДРОПУВАННЯ" вгорі ви можете запускати це знову і знову, щоб експериментувати з варіаціями.

Що мені не вдалося налагодити роботу - це ситуація, коли є вхідні ЗАМЕЧНІ КЛЮЧІ, які вже вказують на поле 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
користувач1717828

0

Я зіткнувся з тією самою проблемою, тому, що я зробив, я скинув поле для первинного ключа, після чого відтворив його і переконався, що він є інкрементальним. Це працювало для мене. Я сподіваюся, що це допомагає іншим


0

ALTER TABLE ім'я_таблиці MODIFY tableNameID MEDIUMINT NOT NULL AUTO_INCREMENT ;

Тут tableName - назва вашої таблиці,

tableName - це назва вашого стовпця, яке має бути основним

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

AUTO_INCREMENT, ви повинні додати просто auto_increment, не null

Це зробить цей первинний ключ auto_increment ......

Сподіваюся, це корисно :)


1
Було б корисно, якщо ви відредагуєте та додасте пояснення.
Шашант

-1

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

Ця таблиця створена на даний момент - Кількість знайдених записів: 4 ім'я ВАРЧАР (20) ТАК порода ВАРЧАР (30) ТА кольоровий ВАРЧАР (20) ДА вага ВАМНИЙ (7) ТАК

Цей прагнений кінцевий результат (ТАБЛИЧНИЙ ОПИС) -

Кількість знайдених записів: 4 назва VARCHAR (20) NO PRI породи VARCHAR (30) ТА кольоровий VARCHAR (20) YES вага SMALLINT (7) YES

Замість того, щоб отримати це -

Кількість знайдених записів: 5 id int (11) НІ прізвище ім'я VARCHAR (20) ТАК порода VARCHAR (30) ТА кольоровий VARCHAR (20) YES вага SMALLINT (7) YES

після спробу ..

$ query = "ALTER TABLE racehorses ADD id INT INT NULL AUTO_INCREMENT ПЕРШИЙ, ADD PRIMARY KEY (id)";

як це отримати? -

Кількість знайдених записів: 4 назва VARCHAR (20) NO PRI породи VARCHAR (30) ТА кольоровий VARCHAR (20) YES вага SMALLINT (7) YES

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.