MySQL: Bagaimana cara menyalin baris, tetapi mengubah beberapa bidang?

195

Saya memiliki banyak baris yang ingin saya salin, tetapi saya perlu mengubah satu bidang.

Saya dapat memilih baris yang ingin saya salin:

select * from Table where Event_ID = "120"

Sekarang saya ingin menyalin semua baris itu dan membuat baris baru sambil mengatur Event_IDto 155. Bagaimana saya bisa mencapai ini?

Andrew
sumber

Jawaban:

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

Di sini, col2, ... mewakili kolom yang tersisa (yang selain Event_ID) di tabel Anda.

dcp
sumber
39
apakah ada cara untuk melakukannya tanpa harus menentukan nama kolom?
Andrew
4
Bukannya aku sadar. Tentu saja, jika tabel Anda memiliki 1000 kolom atau sesuatu dan Anda tidak ingin mengetik semuanya, maka Anda dapat menulis pernyataan SQL untuk membuat pernyataan SQL Anda :). Cara Anda melakukannya adalah dengan menggunakan information_schema untuk mendapatkan nama kolom untuk tabel. Tapi itu benar-benar berlebihan, saya cukup mengetikkan nama kolom.
dcp
3
Apakah ini mungkin menggunakan tanda bintang untuk mendapatkan kolom yang tersisa?
Peter
2
Masuk ke upvote hanya untuk mengetahui bahwa saya sudah melakukan ini. Saya kira ini menyelamatkan saya beberapa kali sekarang :) Terima kasih!
aexl
2
@Bitterblue - Maaf, saya tidak mengerti komentar Anda. Saya tidak pernah mengatakan col2, ... adalah kolom yang tidak ingin Anda salin, saya hanya mengatakan itu mewakili kolom yang tersisa dari tabel. Sudah jelas bahwa mereka akan disalin, jika tidak, mereka tidak akan ada dalam pernyataan SQL sama sekali.
dcp
140

Ini adalah solusi di mana Anda memiliki banyak bidang di meja Anda dan tidak ingin mendapatkan jari kram karena mengetik semua bidang, cukup ketik yang dibutuhkan :)

Cara menyalin beberapa baris ke tabel yang sama, dengan beberapa bidang memiliki nilai yang berbeda:

  1. Buat tabel sementara dengan semua baris yang ingin Anda salin
  2. Perbarui semua baris dalam tabel sementara dengan nilai yang Anda inginkan
  3. Jika Anda memiliki bidang kenaikan otomatis, Anda harus mengaturnya ke NULL di tabel sementara
  4. Salin semua baris tabel sementara ke tabel asli Anda
  5. Hapus tabel sementara

Kode Anda:

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

Kode skenario umum:

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

Kode sederhana / kental:

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;

Karena pembuatan tabel sementara menggunakan TEMPORARYkata kunci itu akan turun secara otomatis ketika sesi selesai (seperti yang disarankan @ ar34z).

Alex Christodoulou
sumber
7
MySQL mendukung TEMPORARYkata kunci untuk membuat tabel sementara. Penggunaan CREATE TEMPORARY TABLEakan secara otomatis menjatuhkan tabel ketika sesi (serangkaian pertanyaan SQL) selesai. Menjatuhkan tabel tidak perlu dan tidak bertentangan dengan tabel sementara lainnya menggunakan nama yang sama. (misal ketika live hacking (yang saya tidak rekomendasikan))
ar34z
1
kode ini hanya berfungsi jika Anda pengguna #t Temporary_table alih-alih temporary_table, mungkin masalah MSSQL?
TruthOf42
16
Ini pada dasarnya bekerja dengan baik untuk saya, tetapi saya memang harus mengatasi kendala Not Null pada kunci utama di tabel temp yang tampaknya akan disalin dari tabel asli. Saya memperbaikinya dengan mengubah tabel temp sebelum pembaruan sebagai berikut:ALTER TABLE temporary_table MODIFY <auto_inc_not_null_field> INT; Kemudian pembaruan kunci utama ke Null tidak akan gagal.
snorris
1
Aku tidak bisa mendapatkannya untuk bekerja di PostgreSQL 9.4: Exception: null value in column <auto_inc_not_null_field> violates not-null constraint. Saya mencobaALTER TABLE temporary_table ALTER COLUMN <auto_inc_not_null_field> DROP NOT NULL;
n1000
1
Saya diuji dengan versi MySQL dan MariaDB yang berbeda. Bekerja sempurna untuk saya dan saya lebih suka versi ini daripada jawaban yang diterima, yang sebenarnya sering terjadi di sini :)
hexerei software
41

Katakanlah meja Anda memiliki dua kolom lain: foo dan bar

INSERT INTO Table (foo, bar, Event_ID)
SELECT foo, bar, "155"
  FROM Table
 WHERE Event_ID = "120"
Peter Bailey
sumber
4
apakah ada cara untuk melakukannya tanpa harus menentukan nama kolom?
Andrew
@ PeterBailey Baru ke MySQL, bisa tolong jelaskan bagaimana kode bekerja: /
3kstc
10

Jika Anda memiliki banyak kolom di tabel Anda dan tidak ingin mengetik masing-masing, Anda dapat melakukannya menggunakan tabel sementara, seperti;

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

UPDATE #TEMP
SET Column = "Changed"
GO

INSERT INTO Table
SELECT *
FROM #Temp
Davethebfg
sumber
6
sebuah catatan: ini mengasumsikan bahwa Anda tidak memiliki kunci utama di meja Anda
kommradHomer
2

Hei bagaimana cara menyalin semua bidang, ubah salah satu dari mereka dengan nilai yang sama + sesuatu yang lain.

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

??????????

Dimitar
sumber
0

Selama Event_ID adalah Integer, lakukan ini:

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