Masukkan kunci primer kenaikan otomatis ke tabel yang ada

157

Saya mencoba mengubah tabel yang tidak memiliki kunci primer atau kolom auto_increment. Saya tahu cara menambahkan kolom kunci utama tetapi saya bertanya-tanya apakah mungkin untuk memasukkan data ke dalam kolom kunci utama secara otomatis (saya sudah memiliki 500 baris dalam DB dan ingin memberi mereka id tetapi saya tidak ingin melakukannya secara manual) . Adakah pikiran? Terima kasih banyak.

Kucing Terbang
sumber
2
Anda dapat dengan mudah melakukan alter tableuntuk menambahkan kunci, tetapi MySQL tidak akan menghasilkan ID untuk bidang yang belum memilikinya. Anda harus secara manual memperbarui bidang yang ada dan kemudian memastikan auto_increment baru Anda mulai dari offset yang tepat - standarnya adalah '1' dan Anda hanya akan berakhir dengan kesalahan kunci duplikat.
Marc B
3
@ MarscB Saya baru saja menguji, dan itu memang memasukkan id untuk baris yang ada mulai dari 1
Michael Berkowski

Jawaban:

253

Sebuah ALTER TABLEpernyataan menambahkan PRIMARY KEYkolom bekerja dengan benar dalam pengujian saya:

ALTER TABLE tbl ADD id INT PRIMARY KEY AUTO_INCREMENT;

Pada tabel sementara yang dibuat untuk tujuan pengujian, pernyataan di atas membuat AUTO_INCREMENT idkolom dan memasukkan nilai kenaikan otomatis untuk setiap baris yang ada di tabel, dimulai dengan 1.

Michael Berkowski
sumber
1
Yap, ini sudah pengalaman saya. Tidak pernah ingat harus menjalankan skrip terpisah untuk mengisi id auto_increment ...
Mike Purcell
1
lol..Terima kasih. salahku. Tanda hijau untuk Anda karena milik Anda lebih mudah untuk diimplementasikan. : D
FlyingCat
53
Untuk menjadikannya kolom pertama, gunakan FIRSTmis.ALTER TABLE tbl1 ADD id INT PRIMARY KEY AUTO_INCREMENT FIRST;
David Thomas
1
Mekanik @Nikkie SQLite sangat berbeda. Anda akan menemukan saran di sini stackoverflow.com/questions/946011/sqlite-add-primary-key
Michael Berkowski
1
@WijaySharma Jika Anda membuat baris dengan penambahan otomatis dan harus segera mengambilnya dengan id, MySQL menawarkan LAST_INSERT_ID()nilai itu SELECT * FROM table_name WHERE id = LAST_INSERT_ID()dan sebagian besar API bahasa pemrograman menawarkan beberapa fungsi / metode untuk mengembalikan nilai itu dalam kode aplikasi.
Michael Berkowski
51

misalkan Anda tidak memiliki kolom untuk kenaikan otomatis seperti id, tidak, maka Anda dapat menambahkan menggunakan kueri berikut:

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

Jika Anda memiliki kolom, maka ubah ke kenaikan otomatis menggunakan kueri berikut:

 ALTER TABLE table_name MODIFY column_name datatype(length) AUTO_INCREMENT PRIMARY KEY
php
sumber
1
Apa yang dilakukan FIRSTpada akhirnya?
Demensik
1
Ini akan membuat idkolom baru menjadi yang pertama dalam tabel dibandingkan dengan yang terakhir, yang merupakan perilaku default.
fmalina
Bekerja dengan baik! Terima kasih!
Majedur Rahaman
4

ya, sesuatu seperti ini akan melakukannya, mungkin bukan yang terbaik, Anda mungkin ingin membuat cadangan

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

perhatikan bahwa yang any_fieldAnda pilih harus sama ketika memperbarui.

Grigor
sumber
4

Bagi yang seperti saya mengalami Multiple primary key definedkesalahan coba:

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

Pada MySQL v5.5.31 ini mengatur idkolom sebagai kunci utama untuk saya dan mengisi setiap baris dengan nilai yang bertambah.

refleksiv
sumber
2

Yang paling mudah dan tercepat yang saya temukan adalah ini

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

Saya mampu beradaptasi petunjuk ini mengambil meja dengan yang ada primary key non-increment, dan menambahkan kunci utama incrementing ke meja dan membuat kunci primer komposit baru dengan kedua tombol lama dan baru sebagai kunci utama komposit menggunakan berikut kode:

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

Saat ini selesai, bidang _USER_ID ada dan memiliki semua nilai angka untuk kunci utama persis seperti yang Anda harapkan. Dengan "DROP TABLE" di bagian atas, Anda dapat menjalankan ini berulang-ulang untuk bereksperimen dengan variasi.

Apa yang saya belum dapat bekerja adalah situasi di mana ada KUNCI ASING masuk yang sudah menunjuk pada bidang USER_ID. Saya mendapatkan pesan ini ketika saya mencoba melakukan contoh yang lebih kompleks dengan kunci asing yang masuk dari tabel lain.

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

Saya menduga bahwa saya perlu menghancurkan semua kunci asing sebelum melakukan tabel ALTER dan kemudian membangunnya kembali setelah itu. Tetapi untuk sekarang saya ingin membagikan solusi ini ke versi yang lebih menantang dari pertanyaan awal jika orang lain menghadapi situasi ini.

drchuck
sumber
0

Ekspor tabel Anda, lalu kosongkan tabel Anda, lalu tambahkan bidang sebagai INT unik, lalu ubah ke AUTO_INCREMENT, lalu impor tabel Anda lagi yang telah Anda ekspor sebelumnya.

David C
sumber
0

Anda bisa menambahkan kolom Kunci Utama baru ke tabel yang ada, yang dapat memiliki nomor urut, menggunakan perintah:

ALTER TABLE mydb.mytable ADD pk_columnName INT IDENTITY 
Nagesh Hugar
sumber
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

Saya menghadapi masalah yang sama sehingga apa yang saya lakukan, saya menjatuhkan bidang untuk kunci utama kemudian saya membuatnya kembali dan memastikan bahwa itu adalah tambahan otomatis. Itu berhasil bagi saya. Saya harap ini membantu orang lain

Humphrey
sumber
0

ALTER TABLE tableName MODIFY tableNameID MEDIUMINT NOT NULL AUTO_INCREMENT ;

Di sini tableName adalah nama tabel Anda,

tableName adalah nama kolom Anda yang harus diubah primer

MEDIUMINT adalah tipe data dari kunci utama yang ada

AUTO_INCREMENT Anda harus menambahkan hanya auto_increment setelah bukan nol

Itu akan membuat auto_increment kunci primer ......

Semoga ini bisa membantu :)

Hrushikesh vanga
sumber
1
Ini akan berguna jika Anda mengedit dan menambahkan beberapa penjelasan.
Shashanth
-1

Bagaimana cara menulis PHP untuk MENGUBAH bidang yang sudah ada (nama, dalam contoh ini) untuk menjadikannya kunci utama? W / o, tentu saja, menambahkan bidang 'id' tambahan ke tabel ..

Ini tabel yang saat ini dibuat - Jumlah Rekaman ditemukan: 4 nama VARCHAR (20) YA berkembang biak VARCHAR (30) YA warna VARCHAR (20) YA berat SMALLINT (7) YA

Ini hasil akhir yang dicari (DESKRIPSI TABEL) -

Jumlah catatan yang ditemukan: 4 nama VARCHAR (20) NO PRI breed VARCHAR (30) YES color VARCHAR (20) YES weight SMALLINT (7) YES

Alih-alih mendapatkan ini -

Jumlah Rekaman yang ditemukan: 5 id int (11) NO PRI name VARCHAR (20) YES breed VARCHAR (30) YES color VARCHAR (20) YES weight SMALLINT (7) YES

setelah mencoba ..

$ query = "ALTER TABLE rachorses ADD id INT NOT NOT NULL AUTO_INCREMENT PERTAMA, TAMBAHKAN KUNCI UTAMA (id)";

bagaimana cara mendapatkan ini? -

Jumlah catatan yang ditemukan: 4 nama VARCHAR (20) NO PRI breed VARCHAR (30) YES color VARCHAR (20) YES weight SMALLINT (7) YES

yaitu INSERT / ADD .. dll. kunci utama KE catatan lapangan pertama (tanpa menambahkan bidang 'id' tambahan, seperti yang dinyatakan sebelumnya.

De Teague
sumber