Jawaban:
Gunakan INSERT ... SELECT
:
insert into your_table (c1, c2, ...)
select c1, c2, ...
from your_table
where id = 1
di mana c1, c2, ...
semua kolom kecuali id
. Jika Anda ingin secara eksplisit memasukkan dengan angka id
2 maka sertakan dalam daftar kolom INSERT dan SELECT Anda:
insert into your_table (id, c1, c2, ...)
select 2, c1, c2, ...
from your_table
where id = 1
Anda harus mengurus kemungkinan duplikat id
2 dalam kasus kedua tentu saja.
IMO, yang terbaik tampaknya menggunakan pernyataan sql hanya untuk menyalin baris itu, sementara pada saat yang sama hanya mereferensikan kolom yang harus dan ingin Anda ubah.
CREATE TEMPORARY TABLE temp_table ENGINE=MEMORY
SELECT * FROM your_table WHERE id=1;
UPDATE temp_table SET id=NULL; /* Update other values at will. */
INSERT INTO your_table SELECT * FROM temp_table;
DROP TABLE temp_table;
Lihat juga av8n.com - Cara Mengkloning Catatan SQL
Manfaat:
your_table
dalam satu operasi atom.Error Code: 1113. A table must have at least 1 column
.
SET id=NULL
dapat menyebabkan kesalahan Column 'id' cannot be null
. Harus diganti olehUPDATE temp_table SET id = (SELECT MAX(id) + 1 as id FROM your_table);
Katakanlah tabelnya user(id, user_name, user_email)
.
Anda dapat menggunakan kueri ini:
INSERT INTO user (SELECT NULL,user_name, user_email FROM user WHERE id = 1)
Result: near "SELECT": syntax error
Ini membantu dan mendukung kolom BLOB / TEXT.
CREATE TEMPORARY TABLE temp_table
AS
SELECT * FROM source_table WHERE id=2;
UPDATE temp_table SET id=NULL WHERE id=2;
INSERT INTO source_table SELECT * FROM temp_table;
DROP TEMPORARY TABLE temp_table;
USE source_table;
Untuk solusi cepat dan bersih yang tidak mengharuskan Anda memberi nama kolom, Anda dapat menggunakan pernyataan yang disiapkan seperti dijelaskan di sini: https://stackoverflow.com/a/23964285/292677
Jika Anda membutuhkan solusi yang kompleks sehingga Anda bisa sering melakukan ini, Anda dapat menggunakan prosedur ini:
DELIMITER $$
CREATE PROCEDURE `duplicateRows`(_schemaName text, _tableName text, _whereClause text, _omitColumns text)
SQL SECURITY INVOKER
BEGIN
SELECT IF(TRIM(_omitColumns) <> '', CONCAT('id', ',', TRIM(_omitColumns)), 'id') INTO @omitColumns;
SELECT GROUP_CONCAT(COLUMN_NAME) FROM information_schema.columns
WHERE table_schema = _schemaName AND table_name = _tableName AND FIND_IN_SET(COLUMN_NAME,@omitColumns) = 0 ORDER BY ORDINAL_POSITION INTO @columns;
SET @sql = CONCAT('INSERT INTO ', _tableName, '(', @columns, ')',
'SELECT ', @columns,
' FROM ', _schemaName, '.', _tableName, ' ', _whereClause);
PREPARE stmt1 FROM @sql;
EXECUTE stmt1;
END
Anda dapat menjalankannya dengan:
CALL duplicateRows('database', 'table', 'WHERE condition = optional', 'omit_columns_optional');
Contohnya
duplicateRows('acl', 'users', 'WHERE id = 200'); -- will duplicate the row for the user with id 200
duplicateRows('acl', 'users', 'WHERE id = 200', 'created_ts'); -- same as above but will not copy the created_ts column value
duplicateRows('acl', 'users', 'WHERE id = 200', 'created_ts,updated_ts'); -- same as above but also omits the updated_ts column
duplicateRows('acl', 'users'); -- will duplicate all records in the table
PENOLAKAN: Solusi ini hanya untuk seseorang yang akan berulang kali menduplikasi baris di banyak tabel, sering. Ini bisa berbahaya di tangan pengguna nakal.
Anda juga dapat memasukkan '0' sebagai nilai untuk penambahan kolom, nilai yang benar akan digunakan ketika catatan dibuat. Ini jauh lebih mudah daripada tabel sementara.
Sumber: Menyalin baris di MySQL (lihat komentar kedua, oleh TRiG, untuk solusi pertama, oleh Lore)
Banyak jawaban bagus di sini. Di bawah ini adalah contoh dari prosedur tersimpan yang saya tulis untuk menyelesaikan tugas ini untuk Aplikasi Web yang saya kembangkan:
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON
-- Create Temporary Table
SELECT * INTO #tempTable FROM <YourTable> WHERE Id = Id
--To trigger the auto increment
UPDATE #tempTable SET Id = NULL
--Update new data row in #tempTable here!
--Insert duplicate row with modified data back into your table
INSERT INTO <YourTable> SELECT * FROM #tempTable
-- Drop Temporary Table
DROP TABLE #tempTable
insert into MyTable(field1, field2, id_backup)
select field1, field2, uniqueId from MyTable where uniqueId = @Id;
Jika Anda dapat menggunakan MySQL Workbench, Anda dapat melakukan ini dengan mengklik kanan baris dan memilih 'Salin baris', lalu mengklik kanan baris kosong dan memilih 'Tempel baris', lalu mengubah ID, dan kemudian mengklik 'Terapkan'.
Salin baris:
Rekatkan baris yang disalin ke baris kosong:
Ubah ID:
Menerapkan:
Saya mencari fitur yang sama tetapi saya tidak menggunakan MySQL. Saya ingin menyalin SEMUA bidang kecuali tentu saja kunci utama (id). Ini adalah permintaan sekali pakai, tidak untuk digunakan dalam skrip atau kode apa pun.
Saya menemukan jalan saya dengan PL / SQL tapi saya yakin IDE SQL lainnya akan melakukannya. Saya melakukan dasar
SELECT *
FROM mytable
WHERE id=42;
Kemudian ekspor ke file SQL di mana saya dapat menemukan
INSERT INTO table (col1, col2, col3, ... , col42)
VALUES (1, 2, 3, ..., 42);
Saya baru saja mengeditnya dan menggunakannya:
INSERT INTO table (col1, col2, col3, ... , col42)
VALUES (mysequence.nextval, 2, 3, ..., 42);
Saya cenderung menggunakan variasi dari apa yang terlalu pendek diposting:
INSERT INTO something_log
SELECT NULL, s.*
FROM something AS s
WHERE s.id = 1;
Selama tabel memiliki bidang yang identik (kecuali kenaikan otomatis pada tabel log), maka ini berfungsi dengan baik.
Karena saya menggunakan prosedur tersimpan sedapat mungkin (untuk membuat hidup lebih mudah pada programmer lain yang tidak terlalu terbiasa dengan database), ini memecahkan masalah harus kembali dan memperbarui prosedur setiap kali Anda menambahkan bidang baru ke tabel.
Ini juga memastikan bahwa jika Anda menambahkan bidang baru ke tabel, bidang itu akan segera muncul di tabel log tanpa harus memperbarui kueri basis data Anda (kecuali tentu saja Anda memiliki beberapa yang menetapkan bidang secara eksplisit)
Peringatan: Anda akan ingin memastikan untuk menambahkan bidang baru ke kedua tabel pada saat yang sama sehingga urutan bidang tetap sama ... jika tidak, Anda akan mulai mendapatkan bug aneh. Jika Anda adalah satu-satunya yang menulis antarmuka database DAN Anda sangat berhati-hati maka ini berfungsi dengan baik. Jika tidak, tetap gunakan penamaan semua bidang Anda.
Catatan: Setelah dipikir-pikir, kecuali jika Anda mengerjakan proyek solo yang Anda yakin tidak akan membuat orang lain mengerjakannya, cantumkan semua nama bidang secara eksplisit dan perbarui laporan log Anda saat skema Anda berubah. Jalan pintas ini mungkin tidak sebanding dengan sakit kepala jangka panjang yang dapat ditimbulkannya ... terutama pada sistem produksi.
Masukkan ke dalam `dbMyDataBase`.`tblMyTable` ( `IdAutoincrement`, `Column2`, `Column3`, `Column4` ) PILIH BATAL, `Column2`, `Column3`, 'CustomValue' AS Kolom4 DARI `dbMyDataBase`.`tblMyTable` WHERE `tblMyTable`.`Column2` = 'UniqueValueOfTheKey' ; / * mySQL 5.6 * /