Yanıtlar:
Kullanım INSERT ... SELECT
:
insert into your_table (c1, c2, ...)
select c1, c2, ...
from your_table
where id = 1
c1, c2, ...
hariç tüm sütunlar nerede id
? id
2 ile açıkça eklemek istiyorsanız , INSERT sütun listenize ve SELECT'inize ekleyin:
insert into your_table (id, c1, c2, ...)
select 2, c1, c2, ...
from your_table
where id = 1
id
Tabii ki ikinci durumda 2'nin olası bir kopyasına dikkat etmeniz gerekir .
IMO, en iyisi sql deyimlerini sadece bu satırı kopyalamak için kullanırken, aynı zamanda sadece ihtiyacınız olan ve değiştirmek istediğiniz sütunlara atıfta bulunur.
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;
Ayrıca bkz. Av8n.com - SQL Kaydını Klonlama
Yararları:
your_table
atomik işlemde tam olarak doğru bir kayıt eklenir .Error Code: 1113. A table must have at least 1 column
.
SET id=NULL
hataya neden olabilir Column 'id' cannot be null
. DeğiştirilmelidirUPDATE temp_table SET id = (SELECT MAX(id) + 1 as id FROM your_table);
Masanın olduğunu söyle user(id, user_name, user_email)
.
Bu sorguyu kullanabilirsiniz:
INSERT INTO user (SELECT NULL,user_name, user_email FROM user WHERE id = 1)
Result: near "SELECT": syntax error
Bu yardımcı oldu ve bir BLOB / METİN sütunlarını destekliyor.
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;
Sütunları adlandırmanızı gerektirmeyen hızlı ve temiz bir çözüm için, burada açıklandığı gibi hazırlanmış bir ifade kullanabilirsiniz: https://stackoverflow.com/a/23964285/292677
Bunu sık sık yapabilmeniz için karmaşık bir çözüme ihtiyacınız varsa, bu yordamı kullanabilirsiniz:
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
Şununla çalıştırabilirsiniz:
CALL duplicateRows('database', 'table', 'WHERE condition = optional', 'omit_columns_optional');
Örnekler
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
YASAL UYARI: Bu çözüm yalnızca birçok tablodaki satırları sık sık çoğaltacak olan kişiler içindir. Sahte bir kullanıcının elinde tehlikeli olabilir.
Otomatik olarak artırılacak sütunun değeri olarak '0' değerini de iletebilirsiniz; kayıt oluşturulduğunda doğru değer kullanılır. Bu geçici tablolardan çok daha kolaydır.
Kaynak: MySQL'deki satırları kopyalama (TRiG tarafından yapılan ikinci yoruma Lore tarafından ilk çözüme bakın)
Burada bir sürü harika cevap var. Aşağıda, geliştirdiğim bir Web Uygulaması için bu görevi gerçekleştirmek için yazdığım saklı yordamın bir örneği verilmiştir:
-- 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;
MySQL Workbench'i kullanabiliyorsanız, satırı sağ tıklayıp 'Satırı kopyala'yı seçip ardından boş satırı sağ tıklayıp' Satırı yapıştır 'seçeneğini belirleyip kimliği değiştirerek yapabilirsiniz. 'Uygula'yı tıklayın.
Satırı kopyalayın:
Kopyalanan satırı boş satıra yapıştırın:
Kimliği değiştirin:
Uygulamak:
Aynı özelliği arıyordum ama MySQL kullanmıyorum. Tabii ki birincil anahtar (id) hariç TÜM alanları kopyalamak istedim. Bu, herhangi bir komut dosyasında veya kodda kullanılmamak için tek seferlik bir sorguydu.
PL / SQL ile yolumu buldum ama başka bir SQL IDE'nin yapacağından eminim. Basit yaptım
SELECT *
FROM mytable
WHERE id=42;
Sonra bulabileceğim bir SQL dosyasına aktarın
INSERT INTO table (col1, col2, col3, ... , col42)
VALUES (1, 2, 3, ..., 42);
Sadece düzenledim ve kullandım:
INSERT INTO table (col1, col2, col3, ... , col42)
VALUES (mysequence.nextval, 2, 3, ..., 42);
Ben çok kısa bir süre içinde yayınlanan mu bir varyasyon kullanma eğilimindedir:
INSERT INTO something_log
SELECT NULL, s.*
FROM something AS s
WHERE s.id = 1;
Tablolar aynı alanlara sahip olduğu sürece (günlük tablosundaki otomatik artış hariç), bu iyi çalışır.
Saklı yordamları mümkün olduğunca kullandığım için (veritabanlarına çok aşina olmayan diğer programcılarda hayatı kolaylaştırmak için), tabloya her yeni alan eklediğinizde geri dönüp yordamları güncelleştirme sorununu çözer.
Ayrıca, bir tabloya yeni alanlar eklerseniz, veritabanı sorgularınızı güncellemek zorunda kalmadan hemen günlük tablosunda görünmeye başlayabilmelerini sağlar (tabii ki bir alanı açıkça ayarlayan bazılarınız yoksa)
Uyarı: Alan sırasının aynı kalması için her iki tabloya da aynı anda yeni alanlar eklediğinizden emin olmak istersiniz ... aksi takdirde tuhaf hatalar almaya başlarsınız. Veritabanı arayüzleri yazan tek kişi iseniz VE çok dikkatli iseniz o zaman bu güzel çalışıyor. Aksi takdirde, tüm alanlarınızı adlandırmaya devam edin.
Not: İkinci bir düşüncede, solo bir proje üzerinde çalışmadığınız sürece, başkalarının üzerinde çalıştığından emin olmadığınız sürece, tüm alan adlarını açıkça listelemeye ve şemanız değiştikçe günlük ifadelerinizi güncelleyin. Bu kısayol muhtemelen neden olabileceği uzun vadeli baş ağrısına değmez ... özellikle bir üretim sisteminde.
DbMyDataBase'e ekle.`tblMyTable` ( `IdAutoincrement`, `Column2`, `Column3`, `Column4` ) SEÇ BOŞ, `Column2`, `Column3`, 'CustomValue' AS Sütun4 DbMyDataBase'TAN.`tblMyTable` NEREDEN `tblMyTable`.`Column2` = 'UniqueValueOfTheKey' ; / * mySQL 5.6 * /