Bagaimana cara menambahkan kunci utama ke tabel MySQL?

103

Inilah yang saya coba tetapi gagal:

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

Apakah ada yang punya tip?

mysql_go
sumber
11
Ketika sesuatu gagal , itu selalu merupakan ide yang baik untuk menentukan apa artinya gagal : apakah Anda mendapatkan pesan kesalahan? yang mana ?
Pascal MARTIN
Saya kira pesan kesalahan terlihat seperti: beberapa kunci primer ditentukan
LMD

Jawaban:

226

Setelah menambahkan kolom, Anda selalu dapat menambahkan kunci utama:

ALTER TABLE goods ADD PRIMARY KEY(id)

Tentang mengapa skrip Anda tidak berfungsi, Anda perlu menentukan PRIMARY KEY, bukan hanya kata PRIMARY:

alter table goods add column `id` int(10) unsigned primary KEY AUTO_INCREMENT;
Scrum Meister
sumber
Bagi saya dikatakan: ini akan menentukan beberapa kunci utama. Saya menggunakan InnoDB. Perhatikan Saya sudah memiliki 3 dari mereka.
LMD
2
Saya pasti akan meletakkan FIRSTsetelah AUTO_INCREMENT, yang berarti, bahwa idakan menjadi kolom pertama dari tabel yang sudah ada. Jika tidak, itu akan diletakkan di ujung tabel seperti yang tertulis sekarang, yang bisa sedikit membingungkan ketika melakukan yang sederhanaSELECT * ...
StefanK
Cara mendapatkan tempat pertama ke kolom 'id' baru
TipVisor
17

Kolom yang Ada

Jika Anda ingin menambahkan batasan kunci utama ke kolom yang ada, semua sintaks yang terdaftar sebelumnya akan gagal.

Untuk menambahkan batasan kunci utama ke kolom yang ada, gunakan formulir:

ALTER TABLE `goods`
MODIFY COLUMN `id` INT(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT;
MER
sumber
1
mysql tidak mengenali MODIFY sebagai pernyataan yang tepat (setidaknya di XAMPP, InnoDB)
LMD
@LMD Anda menggunakan versi mysql apa? (CATATAN: Saya tahu ini berhasil pada saat saya memposting ini dan saya percaya itu 5,6 ... tapi saya tidak ingat pasti)
MER
1
Jika bagi Anda, seperti saya, tidak berhasil ganti MODIFY dengan CHANGE dan itu akan berhasil!
csr-nontol
12

Jika tabel Anda cukup besar lebih baik tidak menggunakan pernyataan:

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

karena itu membuat salinan dari semua data dalam tabel sementara, mengubah tabel dan kemudian menyalinnya kembali. Lebih baik lakukan secara manual. Ubah nama tabel Anda:

rename table goods to goods_old;

buat tabel baru dengan kunci utama dan semua indeks yang diperlukan:

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

pindahkan semua data dari tabel lama ke yang baru, nonaktifkan kunci dan indeks untuk mempercepat penyalinan:

- GUNAKAN INI UNTUK TABEL MyISAM :

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;

ATAU

- GUNAKAN INI UNTUK TABEL InnoDB :

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;

Diperlukan 2000 detik untuk menambahkan PK ke tabel dengan ~ 200 juta baris.

Denis Makarskiy
sumber
Saya terkejut berapa lama saya harus mencari untuk menemukan jawaban ini. Terima kasih atas contoh yang membantu ini.
Ryan
4

Tidak yakin apakah ini masalah bagi orang lain, tetapi saya lebih suka tabel id daripada kolom pertama dalam database. Sintaksnya adalah:

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

Yang hanya sedikit perbaikan dari jawaban pertama. Jika Anda ingin berada di posisi yang berbeda, maka

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

HTH, -ft

ftrotter.dll
sumber
3

Gunakan kueri ini,

alter table `table_name` add primary key(`column_name`);
RATAN KUMAR
sumber
2

Kode ini berfungsi di mysql db saya:

ALTER TABLE `goods`
ADD COLUMN `id` INT NOT NULL AUTO_INCREMENT,
ADD PRIMARY KEY (`id`);
Michał Myszor
sumber
1
ALTER TABLE GOODS MODIFY ID INT(10) NOT NULL PRIMARY KEY;
Vimit Patel
sumber
0

Coba ini,

alter table goods add column `id` int(10) unsigned primary key auto_increment
situs web phpon
sumber
0

Bagi saya, tidak ada saran yang berhasil memberi saya kesalahan sintaks, jadi saya hanya mencoba menggunakan phpmyadmin (versi 4.9.2), (10.4.10-MariaDB) dan menambahkan idkolom dengan kunci primer kenaikan otomatis. Idkolom dengan baik ditambahkan dari elemen pertama.

Output kueri adalah:

ALTER TABLE table_nameTAMBAHKAN idINT BUKAN NULL AUTO_INCREMENT PERTAMA, TAMBAHKAN KUNCI UTAMA ( id);

av3000
sumber
-3

Hapus tanda kutip agar berfungsi dengan baik ...

alter table goods add column id int(10) unsigned primary KEY AUTO_INCREMENT;
Raja Muthukutty
sumber