MySQL tablosuna birincil anahtar nasıl eklenir?


104

Denediğim buydu ama başarısız oldu:

alter table goods add column `id` int(10) unsigned primary AUTO_INCREMENT;

Bahşiş veren var mı?


11
Bir şey olduğunda başarısız , ne belirtmek için iyi bir fikir her zaman başarısız bir hata mesajı alıyorum: araçlar? hangisi ?
Pascal MARTIN

Sanırım hata mesajı şuna benziyor: birden fazla birincil anahtar tanımlı
LMD

Yanıtlar:


227

Sütunu ekledikten sonra, her zaman birincil anahtarı ekleyebilirsiniz:

ALTER TABLE goods ADD PRIMARY KEY(id)

Senaryonuzun neden çalışmadığına gelince PRIMARY KEY, sadece kelimeyi değil, şunu da belirtmeniz gerekir PRIMARY:

alter table goods add column `id` int(10) unsigned primary KEY AUTO_INCREMENT;

Benim için diyor ki: bu, birden çok birincil anahtarı tanımlar. InnoDB kullanıyorum. Not Bende zaten 3 tane var.
LMD

2
Kesinlikle FIRSTsonrasına koyacağım AUTO_INCREMENT, yani idzaten var olan tablonun ilk sütunu olacak. Aksi takdirde, şu anda yazıldığı gibi tablonun sonuna konulacaktır, bu basit yaparken biraz kafa karıştırıcı olabilirSELECT * ...
StefanK

Yeni 'id' sütununda birincilik nasıl elde edilir
TipVisor

17

Mevcut Sütun

Var olan bir sütuna birincil anahtar kısıtlaması eklemek isterseniz, önceden listelenen tüm sözdizimi başarısız olacaktır.

Mevcut bir sütuna birincil anahtar kısıtlaması eklemek için şu formu kullanın:

ALTER TABLE `goods`
MODIFY COLUMN `id` INT(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT;

1
mysql, MODIFY'i uygun bir ifade olarak tanımıyor (en azından XAMPP, InnoDB'de)
LMD

@LMD mysql'in hangi sürümünü kullanıyorsunuz? (NOT: Bunu gönderdiğimde işe yaradığını biliyorum ve 5.6 olduğuna inanıyorum ... ama kesin olarak hatırlayamıyorum)
MER

1
Sizin için, benim için olduğu gibi, MODIFY'i CHANGE ile değiştirin ve çalışacaktır!
csr-nontol

12

Masanız oldukça büyükse, şu ifadeyi kullanmayın:

alter table goods add column `id` int(10) unsigned primary KEY AUTO_INCREMENT;

çünkü geçici bir tablodaki tüm verilerin bir kopyasını oluşturur, tabloyu değiştirir ve sonra geri kopyalar. El ile yapsan iyi olur. Tablonuzu yeniden adlandırın:

rename table goods to goods_old;

birincil anahtar ve tüm gerekli dizinler ile yeni tablo oluşturun:

create table goods (
    id  int(10) unsigned not null AUTO_INCREMENT
    ... other columns ...
    primary key (id)
);

tüm verileri eski tablodan yeniye taşıyın, kopyalamayı hızlandırmak için anahtarları ve dizinleri devre dışı bırakın:

- MyISAM TABLOLARI İÇİN BUNU KULLANIN :

SET UNIQUE_CHECKS=0;
    ALTER TABLE goods DISABLE KEYS;
        INSERT INTO goods (... your column names ...) SELECT ... your column names FROM goods_old; 
    ALTER TABLE goods ENABLE KEYS;
SET UNIQUE_CHECKS=1;

VEYA

- BUNU InnoDB TABLOLAR İÇİN KULLANIN :

SET AUTOCOMMIT = 0; SET UNIQUE_CHECKS=0; SET FOREIGN_KEY_CHECKS=0;
    INSERT INTO goods (... your column names ...) SELECT ... your column names FROM goods_old; 
SET FOREIGN_KEY_CHECKS=1; SET UNIQUE_CHECKS=1; COMMIT; SET AUTOCOMMIT = 1;

~ 200 milyon satırlık bir tabloya PK eklemek 2000 saniye sürer.


Bu cevabı bulmak için ne kadar aramam gerektiğine şaşırdım. Bu faydalı örnekler için teşekkürler.
Ryan

4

Bunun başka biri için önemli olup olmadığından emin değilim, ancak veritabanındaki ilk sütuna kimlik tablosunu tercih ederim. Bunun sözdizimi şöyledir:

ALTER TABLE your_db.your_table ADD COLUMN `id` int(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT FIRST;

Bu, ilk cevaba göre sadece küçük bir gelişme. Farklı bir konumda olmasını istiyorsanız, o zaman

ALTER TABLE unique_address ADD COLUMN `id` int(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT AFTER some_other_column;

HTH, -ft


3

Bu sorguyu kullanın,

alter table `table_name` add primary key(`column_name`);

2

Bu kod mysql db'mde çalışıyor:

ALTER TABLE `goods`
ADD COLUMN `id` INT NOT NULL AUTO_INCREMENT,
ADD PRIMARY KEY (`id`);


0

Bunu dene,

alter table goods add column `id` int(10) unsigned primary key auto_increment

0

Benim için, önerilerin hiçbiri bana sözdizimi hatalarını vererek işe yaramadı, bu yüzden phpmyadmin'i (sürüm 4.9.2), (10.4.10-MariaDB) kullanmayı denedim ve idotomatik artışlı birincil anahtarla sütun ekledim . Idsütun ilk elemandan güzelce eklendi.

Sorgu çıktısı şuydu:

Alter TABLO table_nameEkle idINT NULL AUTO_INCREMENT İLK, birincil anahtar (ADD id);


-3

Düzgün çalışması için alıntıları kaldırın ...

alter table goods add column id int(10) unsigned primary KEY AUTO_INCREMENT;
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.