Otomatik artış birincil anahtarını mevcut tabloya ekle


157

Hiçbir birincil anahtar veya auto_increment sütun olan bir tablo değiştirmek çalışıyorum. Birincil anahtar sütun eklemek nasıl biliyorum ama birincil anahtar sütun otomatik olarak veri eklemek mümkün olup olmadığını merak ediyordum (Ben zaten DB 500 satır var ve onlara kimlik vermek istiyorum ama elle yapmak istemiyorum) . Düşüncesi olan var mı? Çok teşekkürler.


2
alter tableAnahtarı eklemek için kolayca yapabilirsiniz , ancak MySQL zaten sahip olmayan alanlar için kimlik oluşturmaz. Mevcut alanları manuel olarak güncellemeniz ve ardından yeni otomatik_rşleminizin doğru ofsette başladığından emin olmanız gerekir - varsayılan olarak '1' olur ve yine de yinelenen anahtar hatalarıyla sonuçlanırsınız.
Marc B

3
@MarcB Az önce test ettim ve aslında 1'den başlayan mevcut satırların kimliklerini
ekledi

Yanıtlar:


253

Sütunu ALTER TABLEekleyen bir ifade testimde PRIMARY KEYdüzgün çalışıyor:

ALTER TABLE tbl ADD id INT PRIMARY KEY AUTO_INCREMENT;

Test amacıyla oluşturulan geçici bir tabloda, yukarıdaki ifade AUTO_INCREMENT idsütunu oluşturdu ve 1'den başlayarak tablodaki her mevcut satır için otomatik artış değerlerini ekledi.


1
Evet, bu benim deneyimimdi. Auto_increment kimliklerini doldurmak için ayrı bir komut dosyası çalıştırmayı asla hatırlamayın ...
Mike Purcell

1
Hah ha ha teşekkürler. benim hatam. Yeşil işaret sizin içindir, çünkü sizinki uygulamak daha kolaydır. : D
FlyingCat

53
İlk sütun yapmak için FIRSTörneğin kullanınALTER TABLE tbl1 ADD id INT PRIMARY KEY AUTO_INCREMENT FIRST;
David Thomas

1
@Nikkie SQLite'ın mekaniği oldukça farklı. Burada önerileri bulacaksınız stackoverflow.com/questions/946011/sqlite-add-primary-key
Michael Berkowski

1
@WijaySharma Satırı otomatik artışla oluşturduysanız ve hemen id ile almanız gerekiyorsa, MySQL LAST_INSERT_ID()bu değeri sunar SELECT * FROM table_name WHERE id = LAST_INSERT_ID()ve çoğu programlama dili API'si bu değeri uygulama kodunda döndürmek için bazı işlev / yöntem sunar.
Michael Berkowski

51

id, hayır gibi otomatik artış için sütununuz olmadığını varsayalım, o zaman aşağıdaki sorguyu kullanarak ekleyebilirsiniz:

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

Sütununuz varsa, aşağıdaki sorguyu kullanarak otomatik artırmayı değiştirin:

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

1
Neyi FIRSTsonunda yapar?
Dementic

1
Yeni idsütunu, varsayılan davranış olan sondan farklı olarak tabloda ilk yapar.
fmalina

İyi çalışıyor! Teşekkürler!
Majedur Rahaman

4

evet, böyle bir şey yapardı, en iyisi olmayabilir, ancak bir yedekleme yapmak isteyebilirsiniz

$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++;
}

O haber any_fieldne zaman güncelleme aynı olmalıdır seçin.


4

Benim gibi bir Multiple primary key definedhata almak için deneyin:

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

MySQL v5.5.31'de bu, idsütunu benim için birincil anahtar olarak ayarladı ve her satırı artan bir değerle doldurdu.


2

En kolay ve en hızlı bulduğum şey bu

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

2

Bu talimatları, var olmayan artımlı birincil anahtarla bir tablo alıp tabloya artan bir birincil anahtar ekleyebildim ve aşağıdakileri kullanarak hem eski hem de yeni anahtarlarla bileşik bir birincil anahtar olarak yeni bir bileşik birincil anahtar oluşturabildim kod:

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 );

Bu yapıldığında, _USER_ID alanı bulunur ve birincil anahtar için tam olarak beklediğiniz gibi tüm sayı değerlerine sahiptir. Üstteki "DROP TABLE" ile, varyasyonları denemek için bunu tekrar tekrar çalıştırabilirsiniz.

Ne işe alamadım ne zaten USER_ID alanında işaret gelen gelen FOREIGN KEYs durumudur. Başka bir tablodan gelen yabancı anahtarla daha karmaşık bir örnek yapmaya çalıştığımda bu iletiyi alıyorum.

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

ALTER tablosunu yapmadan önce tüm yabancı anahtarları yıkmam ve daha sonra bunları yeniden oluşturmam gerektiğini tahmin ediyorum. Ama şimdilik bu çözümü başkalarının bu duruma girmesi durumunda orijinal sorunun daha zorlayıcı bir versiyonuyla paylaşmak istedim.


0

Tablonuzu dışa aktarın, ardından tablonuzu boşaltın, ardından alanı benzersiz INT olarak ekleyin, ardından AUTO_INCREMENT olarak değiştirin, ardından daha önce dışa aktardığınız tablonuzu tekrar içe aktarın.


0

Komut kullanarak varolan bir tabloya sıra numaraları içerebilen yeni Birincil Anahtar sütunu ekleyebilirsiniz:

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

Aynı sorunla karşı karşıya kaldım, bu yüzden yaptığım şey birincil anahtar için alanı düşürdüm, sonra onu yeniden oluşturdum ve otomatik artımlı olduğundan emin oldum. Bu benim için çalıştı. Umarım başkalarına yardımcı olur


0

ALTER TABLE tabloAdı tabloyu DEĞİŞTİR ADI ID MEDIUMINT NOT NULL AUTO_INCREMENT ;

Burada tableName tablonuzun adı,

tableName , birincil olan değiştirilmesi gereken sütun adınızdır

MEDIUMINT mevcut birincil anahtarınızın veri türüdür

AUTO_INCREMENT , null değerinden sonra yalnızca auto_increment eklemeniz gerekiyor

Bu birincil anahtar auto_increment yapacak ......

Umarım bu yardımcı olur :)


1
Bazı açıklamalar düzenleyip eklerseniz faydalı olur .
Shashanth

-1

Birincil anahtar yapmak için zaten var olan alanı (bu örnekte ad) ALTER'e PHP nasıl yazılır? Tabii ki, tabloya herhangi bir ek 'id' alanı ekleyerek ..

Bu tablo şu anda oluşturulan - Bulunan Kayıt Sayısı: 4 isim VARCHAR (20) YES cins VARCHAR (30) EVET renk VARCHAR (20) EVET ağırlık SMALLINT (7) EVET

Bu bir sonuç aranıyor (TABLO TANIMI) -

Bulunan kayıt sayısı: 4 name VARCHAR (20) NO PRI cins VARCHAR (30) EVET renk VARCHAR (20) EVET ağırlık SMALLINT (7) EVET

Bunu almak yerine -

Bulunan Kayıt sayısı: 5 id int (11) NO PRI adı VARCHAR (20) EVET cins VARCHAR (30) EVET renk VARCHAR (20) EVET ağırlık SMALLINT (7) EVET

denedikten sonra ..

$ query = "ALTER TABLE yarış atıları ADD id INT NULL NOT AUTO_INCREMENT İLK, PRIMARY KEY (id) ekle";

bunu nasıl alabilirim? -

Bulunan kayıt sayısı: 4 name VARCHAR (20) NO PRI cins VARCHAR (30) EVET renk VARCHAR (20) EVET ağırlık SMALLINT (7) EVET

yani INSERT / ADD .. vb. birincil anahtar INTO ilk alan kaydına (daha önce belirtildiği gibi ek bir 'id' alanı ekleyerek).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.