MySQL: Nasıl satır kopyalanır, ancak birkaç alan değiştirilir?


195

Kopyalamak istediğim çok sayıda satır var, ancak bir alanı değiştirmem gerekiyor.

Kopyalamak istediğim satırları seçebilirim:

select * from Table where Event_ID = "120"

Şimdi tüm bu satırları kopyalayıp ayarlanırken yeni satırlar oluşturmak istediğiniz Event_IDiçin 155. Bunu nasıl başarabilirim?

Yanıtlar:


279
INSERT INTO Table
          ( Event_ID
          , col2
           ...
          )
     SELECT "155"
          , col2
           ...
      FROM Table WHERE Event_ID = "120"

Burada, col2, ... tablonuzda kalan sütunları ( Event_ID dışındaki sütunlar) temsil eder .


39
sütun adlarını belirtmeden yapmanın bir yolu var mı?
Andrew

4
Farkında olduğumdan değil. Tabii ki, tablonuzda 1000 sütun veya başka bir şey varsa ve hepsini yazmak istemiyorsanız, SQL ifadenizi oluşturmak için bir SQL ifadesi yazabilirsiniz :). Bunu yapmanın yolu, tablonun sütun adlarını almak için information_schema kullanmaktır. Ama bu çok abartılı, sadece sütun isimlerini yazarım.
dcp

3
Kalan sütunları almak için yıldız işareti kullanmak mümkün mü?
Peter

2
Ben zaten bu upvoted var öğrenmek için giriş yapmak için giriş yaptı. Sanırım bu beni birkaç kez kurtardı :) Teşekkürler!
aexl

2
@Bitterblue - Üzgünüz, yorumunuzu anlamıyorum. Asla col2, ... kopyalamak istemediğiniz sütunlar demedim, sadece tablodaki kalan sütunları temsil ettiklerini söyledim. Kopyalanacakları açıktır, aksi takdirde SQL deyiminde olmazlar.
dcp

140

Bu, tablonuzda birçok alanın bulunduğu ve tüm alanları yazarak bir parmak krampı almak istemediğiniz bir çözümdür, sadece gerekli olanları yazın :)

Bazı satırlar farklı değerlere sahip olacak şekilde bazı satırları aynı tabloya kopyalama:

  1. Kopyalamak istediğiniz tüm satırları içeren geçici bir tablo oluşturun
  2. Geçici tablodaki tüm satırları istediğiniz değerlerle güncelleyin
  3. Otomatik artış alanınız varsa, geçici tabloda NULL olarak ayarlamanız gerekir
  4. Geçici tablonun tüm satırlarını orijinal tablonuza kopyalayın
  5. Geçici tabloyu silme

Senin kodun:

CREATE table temporary_table AS SELECT * FROM original_table WHERE Event_ID="155";

UPDATE temporary_table SET Event_ID="120";

UPDATE temporary_table SET ID=NULL

INSERT INTO original_table SELECT * FROM temporary_table;

DROP TABLE temporary_table

Genel senaryo kodu:

CREATE table temporary_table AS SELECT * FROM original_table WHERE <conditions>;

UPDATE temporary_table SET <fieldx>=<valuex>, <fieldy>=<valuey>, ...;

UPDATE temporary_table SET <auto_inc_field>=NULL;

INSERT INTO original_table SELECT * FROM temporary_table;

DROP TABLE temporary_table

Basitleştirilmiş / yoğunlaştırılmış kod:

CREATE TEMPORARY TABLE temporary_table AS SELECT * FROM original_table WHERE <conditions>;

UPDATE temporary_table SET <auto_inc_field>=NULL, <fieldx>=<valuex>, <fieldy>=<valuey>, ...;

INSERT INTO original_table SELECT * FROM temporary_table;

Geçici tablonun oluşturulması TEMPORARYanahtar kelimeyi kullandığından , oturum bittiğinde otomatik olarak bırakılır (@ ar34z önerdiği gibi).


7
MySQL, TEMPORARYgeçici tablolar oluşturmak için anahtar kelimeyi destekler . CREATE TEMPORARY TABLEOturumu (SQL sorgularının bir serisi) bittiğinde, kullanımı otomatik olarak tabloyu düşürür. Tabloyu bırakmak gerekli değildir ve aynı adı kullanan diğer geçici tablolarla çakışmaz. (örneğin canlı kesmek (ki ben tavsiye etmem))
ar34z

1
Bu kod yalnızca geçici_tablo yerine #temporary_table kullanıcısı, belki bir MSSQL sorunu varsa çalışır?
TruthOf42

16
Bu temelde benim için mükemmel çalıştı, ama orijinal tablodan kopyalanıyor gibi görünüyor geçici tablodaki birincil anahtar bir Not Null kısıtlaması aşmak zorunda kaldım. Güncelleme öncesi temp tablosunu aşağıdaki gibi değiştirerek bunu düzelttim: ALTER TABLE temporary_table MODIFY <auto_inc_not_null_field> INT; Sonra birincil anahtarın Null olarak güncelleştirilmesi başarısız olmaz.
snorris

1
Ben PostgreSQL 9.4 çalışmak için alınamıyor: Exception: null value in column <auto_inc_not_null_field> violates not-null constraint. DenedimALTER TABLE temporary_table ALTER COLUMN <auto_inc_not_null_field> DROP NOT NULL;
n1000

1
Farklı MySQL ve MariaDB sürümleriyle test ettim. Benim için mükemmel çalışıyor ve ben aslında burada oldukça sık gerçekleşen kabul edilen cevaba bu versiyonu tercih ederim :)
hexerei yazılım 13:16

41

Diyelim ki tablonuzda iki sütun daha var: foo ve bar

INSERT INTO Table (foo, bar, Event_ID)
SELECT foo, bar, "155"
  FROM Table
 WHERE Event_ID = "120"

4
sütun adlarını belirtmeden yapmanın bir yolu var mı?
Andrew

@PeterBailey MySQL'de yeni, lütfen kodun nasıl çalıştığına dair biraz ışık tutabilir misiniz: /
3kstc

10

Tablonuzda bir sürü sütun varsa ve her birini yazmak istemiyorsanız, geçici bir tablo kullanarak yapabilirsiniz;

SELECT *
INTO #Temp
FROM Table WHERE Event_ID = "120"
GO

UPDATE #TEMP
SET Column = "Changed"
GO

INSERT INTO Table
SELECT *
FROM #Temp

6
not: Bu, tablonuzda birincil anahtarınız olmadığını varsayar
kommradHomer

2

Hey, tüm alanları kopyalamaya, bunlardan birini aynı değere + başka bir şeye değiştirmeye ne dersiniz?

INSERT INTO Table (foo, bar, Event_ID)
SELECT foo, bar, Event_ID+"155"
  FROM Table
 WHERE Event_ID = "120"

??????????


0

Event_ID Tamsayı olduğu sürece bunu yapın:

INSERT INTO Table (foo, bar, Event_ID)
SELECT foo, bar, (Event_ID + 155)
  FROM Table
WHERE Event_ID = "120"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.