insert into table select * from table where primarykey=1
Saya hanya ingin menyalin satu baris untuk disisipkan ke dalam tabel yang sama (yaitu, saya ingin menduplikasi baris yang ada di tabel) tetapi saya ingin melakukan ini tanpa harus mendaftar semua kolom setelah "pilih", karena tabel ini memiliki kolom terlalu banyak.
Tetapi ketika saya melakukan ini, saya mendapatkan kesalahan:
Entri duplikat 'xxx' untuk kunci 1
Saya bisa menangani ini dengan membuat tabel lain dengan kolom yang sama sebagai wadah sementara untuk catatan yang ingin saya salin:
create table oldtable_temp like oldtable;
insert into oldtable_temp select * from oldtable where key=1;
update oldtable_tem set key=2;
insert into oldtable select * from oldtable where key=2;
Apakah ada cara yang lebih sederhana untuk menyelesaikan ini?
mysql
copy
duplicates
row
lina
sumber
sumber
max(oldtable.id) + oldtable_temp.key
ini saya memastikan kenaikan id dan unik.Jawaban:
Saya menggunakan teknik Leonard Challis dengan beberapa perubahan:
Sebagai tabel temp, seharusnya tidak ada lebih dari satu catatan, jadi Anda tidak perlu khawatir tentang kunci utama. Menetapkannya ke nol memungkinkan MySQL untuk memilih nilai itu sendiri, sehingga tidak ada risiko membuat duplikat.
Jika Anda ingin menjadi sangat yakin bahwa Anda hanya mendapatkan satu baris untuk disisipkan, Anda dapat menambahkan LIMIT 1 di akhir baris INSERT INTO.
Perhatikan bahwa saya juga menambahkan nilai kunci utama (1 dalam kasus ini) ke nama tabel sementara saya.
sumber
tmptable_1
vstmptable
)primarykey
INT NULL; setelah baris pertama untuk membuat solusi bekerjaPembaruan 07/07/2014 - Jawaban berdasarkan jawaban saya, oleh Grim ... , adalah solusi yang lebih baik karena meningkatkan solusi saya di bawah, jadi saya sarankan menggunakan itu.
Anda dapat melakukan ini tanpa mencantumkan semua kolom dengan sintaks berikut:
Anda dapat memutuskan untuk mengubah kunci utama dengan cara lain.
sumber
tmptable
, Anda tidak perlu menambahkanWHERE primarykey = 2
pernyataan untuk baris terakhir juga. (YaituINSERT INTO table SELECT * FROM tmptable
.)Saya berasumsi Anda ingin catatan baru memiliki yang baru
primarykey
? Jikaprimarykey
iniAUTO_INCREMENT
kemudian hanya melakukan ini:... di mana
col1, col2, col3, ...
semua kolom dalam tabel kecuali untukprimarykey
.Jika bukan
AUTO_INCREMENT
kolom dan Anda ingin dapat memilih nilai baru untukprimarykey
itu serupa:... di mana
567
nilai baru untukprimarykey
.sumber
Anda hampir memilikinya dengan kueri pertama Anda, Anda hanya perlu menentukan kolom, dengan cara itu Anda dapat mengecualikan kunci utama Anda di sisipan yang akan memberlakukan kenaikan otomatis yang mungkin Anda miliki di atas meja untuk secara otomatis membuat kunci primer baru untuk masuk.
Misalnya ubah ini:
Untuk ini:
Hanya saja, jangan memasukkan kolom kunci utama dalam daftar kolom untuk INSERT atau untuk bagian SELECT dari permintaan.
sumber
insert into table ("val1", col2, col3) select col2, col3 from table where primarykey = 1
atau yang serupa?Anda juga dapat mencoba membuang tabel, menemukan perintah memasukkan dan mengeditnya:
The
--skip-extended-insert
memberikan satu perintah insert per baris. Anda kemudian dapat menemukan baris di editor teks favorit Anda, ekstrak perintah dan ubah kunci utama menjadi "default".sumber
Prosedur ini mengasumsikan bahwa:
Tentu saja ini tidak sempurna, tetapi dalam kasus-kasus tertentu (mungkin sebagian besar) itu akan berhasil.
sumber
works
tetapi pendekatannya masuk akal, dan bernilai karena unik di sini dan benar-benar menjawab pertanyaan OP.Ini dapat dicapai dengan beberapa kreativitas:
Ini akan menghasilkan baris baru mendapatkan id yang bertambah secara otomatis alih-alih id dari baris yang dipilih.
sumber
Jika bidang kunci utama tabel Anda adalah bidang kenaikan otomatis, maka Anda bisa menggunakan kueri dengan kolom. Misalnya, nama tabel Anda
test_tbl
memiliki 3 bidang sebagaiid, name, age
.id
adalah bidang kunci utama dan kenaikan otomatis, sehingga Anda dapat menggunakan kueri berikut untuk menduplikasi baris:Kueri ini menghasilkan duplikasi setiap baris.
Jika bidang kunci utama tabel Anda bukan bidang kenaikan otomatis, maka Anda dapat menggunakan metode berikut:
Hasil dari kueri ini adalah baris duplikat yang
id=19
disisipkan sebagaiid=20
.sumber
tableName
(fieldName1
,fieldName2
,fieldName3
) SELECTfieldName1
,fieldName2
,fieldName3
DARItableName
MANA 1 (untuk menyalin semua dari mereka sekaligus)baris klon dengan bidang pembaruan dan nilai kenaikan otomatis
sumber
Beberapa hal berikut diperoleh dari situs ini. Inilah yang saya lakukan untuk menduplikasi catatan dalam tabel dengan sejumlah bidang:
Ini juga mengasumsikan Anda memiliki bidang AI di awal tabel
sumber
Saya mungkin terlambat dalam hal ini, tetapi saya memiliki solusi serupa yang berhasil bagi saya.
Dengan cara ini saya tidak perlu membuat tabel sementara dan lain-lain. Seperti baris disalin dalam tabel yang sama
Max(PK)+1
fungsinya dapat digunakan dengan mudah.Saya datang mencari solusi dari pertanyaan ini (lupa sintaksisnya) dan akhirnya saya membuat pertanyaan sendiri. Lucu bagaimana hal itu terjadi beberapa kali.
Salam
sumber
Jika Kunci Utama adalah Peningkatan Otomatis, cukup tentukan setiap bidang kecuali kunci utama.
INSERT INTO table(field1,field2,field3) SELECT (field1,field2,field3) FROM table WHERE primarykey=1
sumber
Saya memperbarui solusi @ LeonardChallis karena tidak berfungsi untuk saya karena tidak ada yang lain. Saya menghapus
WHERE
klausa danSET primaryKey = 0
di tabel temp sehingga MySQL secara otomatis menambah sendiri primaryKeyIni tentu saja untuk menduplikasi semua baris dalam tabel.
sumber
Saya menggunakan teknik Grim dengan sedikit perubahan: Jika seseorang mencari permintaan ini adalah karena tidak dapat melakukan permintaan sederhana karena masalah kunci utama:
Dengan MySql saya menginstal 5.6.26, kunci tidak dapat dibatalkan dan menghasilkan kesalahan:
Jadi setelah membuat tabel sementara saya mengubah kunci utama menjadi nullable.
sumber
Saya akan gunakan di bawah ini,
sumber
Saya menggunakan dalam database Koha saya untuk memasukkan item duplikat dengan awalan 'C' di kolom barcode :
sumber
Saya hanya perlu melakukan ini dan ini adalah solusi manual saya:
Jika Anda tidak tahu apa bidang PRIMER itu, lihat kembali halaman phpmyadmin Anda , klik pada tab 'Struktur' dan di bagian bawah halaman di bawah 'Indeks' itu akan menunjukkan kepada Anda 'Bidang' mana yang memiliki 'Keyname' nilai 'PRIMER' .
Agak jauh, tetapi jika Anda tidak ingin berurusan dengan markup dan hanya perlu menduplikasi satu baris di sana Anda pergi.
sumber
Solusi ini menunjukkan karya di atas sempurna juga untuk baris yang dipilih. Misalnya saya membuat baris demonstrasi untuk proyek nice2work saya, dan ini berfungsi dengan sempurna.
sumber
Maaf untuk necropost tapi inilah yang saya temukan dengan google dan karena saya menemukan ini membantu tapi bermasalah saya ingin berkontribusi modifikasi penting bagi siapa pun yang menggali ini.
Pertama, saya menggunakan SQL Server, bukan MySQL, tapi saya pikir itu harus bekerja sama. Saya menggunakan solusi Leonard Challis karena itu paling sederhana dan memenuhi kebutuhan, namun ada masalah dengan ini - jika Anda hanya mengambil PK dan menambahnya 1 maka apa yang terjadi jika Anda telah menambahkan catatan lain sejak baris yang dipertanyakan ditambahkan . Saya memutuskan bahwa yang terbaik adalah membiarkan sistem menangani perbaikan otomatis PK, jadi saya melakukan yang berikut:
Saya percaya ini akan bekerja dengan cara yang sama di MySQL, tapi saya tidak bisa menguji ini, maaf
sumber
Saya tahu ini pertanyaan lama, tapi di sini ada solusi lain:
Ini menggandakan baris di tabel utama, dengan asumsi kunci utama adalah kenaikan otomatis, dan membuat salinan data tabel terkait dengan id tabel utama baru.
Pilihan lain untuk mendapatkan nama kolom:
-MUNJUKKAN KOLOM DARI
tablename
; (Nama kolom: Field)-DESCRIBE
tablename
(Nama kolom: Field)-SELECT column_name FROM information_schema.columns WHERE table_name = 'tablename' (Nama kolom: column_name)
sumber
max233 sudah pasti di jalur yang benar, setidaknya untuk kasus peningkatan otomatis. Namun, jangan lakukan ALTER TABLE. Cukup setel bidang kenaikan-otomatis di tabel sementara ke NULL. Ini akan menampilkan kesalahan, tetapi MASUKKAN semua bidang di tabel sementara berikut akan terjadi dan bidang otomatis NULL akan mendapatkan nilai unik.
sumber
Buat tabel
Sisipkan satu baris
Masukkan baris klon di atas
Uji
sumber
Inilah jawaban yang saya temukan online di situs ini Menjelaskan cara melakukan hal di atas 1 Anda dapat menemukan jawabannya di bagian bawah halaman. Pada dasarnya, apa yang Anda lakukan adalah menyalin baris yang akan disalin ke tabel sementara yang disimpan dalam memori. Anda kemudian mengubah nomor Kunci Utama menggunakan pembaruan. Anda kemudian memasukkan kembali ke tabel target. Anda kemudian menjatuhkan meja.
Ini adalah kode untuk itu:
Saya membuat rescueteam tabel sementara. Saya menyalin baris dari tabel asli fitnessreport4 saya. Saya kemudian mengatur kunci utama untuk baris di tabel sementara ke nol sehingga saya bisa menyalinnya kembali ke tabel asli tanpa mendapatkan kesalahan kunci duplikat. Saya mencoba kode ini kemarin malam dan berhasil.
sumber
Ini adalah solusi tambahan untuk jawaban oleh "Grim ..." Ada beberapa komentar di atasnya yang memiliki kunci utama sebagai nol. Beberapa komentar tentang itu tidak berfungsi. Dan beberapa komentar tentang solusi. Tidak ada solusi yang berhasil bagi kami. Kami memiliki MariaDB dengan tabel InnoDB.
Kami tidak dapat mengatur kunci utama untuk mengizinkan nol. Menggunakan 0 bukannya NULL menyebabkan kesalahan nilai duplikat untuk kunci utama.
SET SQL_SAFE_UPDATES = 0;
Tidak berhasil juga.Solusi dari "Grim ..." berhasil JIKA kita mengubah KUNCI UTAMA kita menjadi UNIK
sumber
Hanya ingin memposting sepotong kode PHP saya, karena saya pikir cara saya mengumpulkan kolom sedikit lebih bersih dalam kode daripada contoh sebelumnya. Ini juga menunjukkan bagaimana Anda bisa dengan mudah mengubah bidang, dalam hal ini menambahkan string. Tetapi Anda juga bisa mengganti bidang kunci asing dengan catatan yang baru ditambahkan, jika Anda ingin menyalin beberapa catatan anak juga.
sumber
Untuk solusi yang sangat sederhana, Anda dapat menggunakan PHPMyAdmin untuk mengekspor baris sebagai file CSV kemudian cukup mengimpor file CSV yang diubah. Mengedit kolom ID / primarykey untuk tidak menunjukkan nilai sebelum Anda mengimpornya.
Kemudian di bagian bawah halaman:
Di mana dikatakan "Ekspor" cukup ekspor, lalu edit file csv untuk menghapus nilai primarykey, jadi itu kosong, dan kemudian hanya impor ke dalam database, primarykey baru akan ditugaskan pada impor.
sumber