Dapatkan Pernyataan Sisipkan untuk baris yang ada di MySQL

145

Menggunakan MySQL saya dapat menjalankan kueri:

SHOW CREATE TABLE MyTable;

Dan itu akan mengembalikan pernyataan buat tabel untuk tabel tertentu. Ini berguna jika Anda telah membuat tabel, dan ingin membuat tabel yang sama di database lain.

Apakah mungkin untuk mendapatkan pernyataan sisipkan untuk baris yang sudah ada, atau kumpulan baris? Beberapa tabel memiliki banyak kolom, dan alangkah baiknya bagi saya untuk mendapatkan pernyataan sisipan untuk mentransfer baris ke database lain tanpa harus menulis pernyataan penyisipan, atau tanpa mengekspor data ke CSV dan kemudian mengimpor data yang sama ke database lain.

Hanya untuk memperjelas, yang saya inginkan adalah sesuatu yang akan berfungsi sebagai berikut:

SHOW INSERT Select * FROM MyTable WHERE ID = 10;

Dan dapatkan yang berikut ini kembali untukku:

INSERT INTO MyTable(ID,Col1,Col2,Col3) VALUES (10,'hello world','some value','2010-10-20');
Kibbee
sumber
Alat apa yang Anda gunakan untuk terhubung ke DB? Beberapa program menyediakan template seperti itu.
GôTô
2
@kibbee, Sudahkah Anda menemukan solusi untuk ini ??
Hasina
2
Akan senang jawaban yang menunjukkan pernyataan INSERT dari mysql>prompt. Sejauh ini tidak ada yang melakukannya.
Bob Stein
apakah Anda telah menemukan solusi untuk ini, untuk mendapatkan pernyataan sisipkan secara terprogram?
Vaibhav Jain

Jawaban:

163

Sepertinya tidak ada cara untuk mendapatkan INSERTpernyataan dari konsol MySQL, tetapi Anda bisa mendapatkannya menggunakan mysqldump seperti yang disarankan Rob. Tentukan -tuntuk menghilangkan pembuatan tabel.

mysqldump -t -u MyUserName -pMyPassword MyDatabase MyTable --where="ID = 10"
Kaivosukeltaja
sumber
1
Lihat ini jika Anda mendapatkan kesalahan mysqldump: Tidak dapat mengeksekusi 'SELECT @@ GTID_MODE': Variabel sistem tidak dikenal 'GTID_MODE' (1193) gist.github.com/arun057/5556563
Daniel Schaffer
11
Dan Anda dapat menambahkan "--complete-insert" jika Anda menginginkan nama kolom / kolom dengan pernyataan insert
MeatPopsicle
4
- transaksi
tunggal
1
dan --hex-blobjika Anda memiliki kolom blob (misalnya a bit(1)), ini akan menuliskannya sebagai string sebaliknya, yang dapat mengakibatkan Unknown command '\0'kesalahan saat menjalankan INSERT.
moffeltje
83

Di MySQL Workbench Anda dapat mengekspor hasil kueri tabel tunggal mana pun sebagai daftar INSERTpernyataan. Jalankan saja kueri, lalu:

Jepretan tombol ekspor

  1. klik pada floppy disk di dekat Export/Importhasil di atas
  2. beri nama file target
  3. di bagian bawah jendela, untuk FormatmemilihSQL INSERT statements
  4. klik Save
  5. klik Export
Zoltán
sumber
2
Selain itu, ikon di sebelah kanan sangat berguna untuk mengimpor ekspor yang baru saja Anda buat. Fitur yang sangat bagus. Satu-satunya bagian yang sulit adalah Anda hanya dapat mengakses ikon dari panel hasil set setelah memilih.
Half_Duplex
14

Karena Anda menyalin tabel dengan SQL yang dihasilkan oleh SHOW CREATE TABLE MyTable , Anda dapat melakukan hal berikut untuk memuat data ke tabel baru.

INSERT INTO dest_db.dest_table SELECT * FROM source_db.source_table;

Jika Anda benar-benar menginginkan pernyataan INSERT, maka satu-satunya cara yang saya tahu adalah menggunakan mysqldump http://dev.mysql.com/doc/refman/5.1/en/mysqldump.htm . Anda bisa memberinya opsi untuk hanya membuang data untuk tabel tertentu dan bahkan membatasi baris.

Rob Prouse
sumber
Basis data yang dipermasalahkan ada di mesin yang secara fisik berbeda, di jaringan yang berbeda, jadi metode ini tidak akan berfungsi untuk saya, tetapi berfungsi dengan baik untuk database yang berjalan pada contoh MySQL yang sama
Kibbee
1
Apakah Anda mencoba untuk memindahkan subkumpulan data antar mesin secara terprogram? Tidak bisakah Anda menggunakan mesin kedua untuk mencerminkan data, lalu memindahkan subset Anda di antara database pada budak?
Rob Prouse
1
Mari, demi argumen, katakanlah saya memiliki tabel yang berisi Zona Waktu. Sekarang, untuk beberapa alasan zona waktu baru dibuat (mungkin dengan selisih waktu 15 menit atau semacamnya). Jadi saya menambahkan baris baru ke database pengembangan yang berisi semua informasi tentang zona waktu baru dan melakukan semua pengujian yang diperlukan. Ketika tiba saatnya untuk memindahkan informasi zona waktu itu ke database produksi, saya harus membuat pernyataan insert dari awal, atau melakukan ekspor / impor. Alangkah baiknya bisa mendapatkan sisipan, lalu memasukkannya ke dalam skrip untuk menghidupkan zona waktu yang baru.
Kibbee
1
Saya tidak memiliki sisipan asli karena saya mungkin telah memasukkannya menggunakan alat GUI, atau saya mungkin harus mengubahnya 3 kali dari nilai asli yang saya sisipkan.
Kibbee
1
Saya kebetulan membutuhkan solusi sederhana untuk database di mesin yang sama dan Google membawa saya ke sini. Jadi saya berterima kasih atas jawaban ini, meskipun itu di luar konteks pertanyaan aslinya :)
Jason McCarrell
10

Saya menulis fungsi php yang akan melakukan ini. Saya perlu membuat pernyataan sisipan jika catatan perlu diganti setelah penghapusan untuk tabel riwayat:

function makeRecoverySQL($table, $id)
{
    // get the record          
    $selectSQL = "SELECT * FROM `" . $table . "` WHERE `id` = " . $id . ';';

    $result = mysql_query($selectSQL, $YourDbHandle);
    $row = mysql_fetch_assoc($result); 

    $insertSQL = "INSERT INTO `" . $table . "` SET ";
    foreach ($row as $field => $value) {
        $insertSQL .= " `" . $field . "` = '" . $value . "', ";
    }
    $insertSQL = trim($insertSQL, ", ");

    return $insertSQL;
}
Chris Adams
sumber
3
Solusi ini cukup rapuh. Misalnya, jika salah satu record Anda berisi nama O' Malley, kueri yang dihasilkan akan mengalami kesalahan sintaksis karena tanda kutip tunggal tidak cocok. Anda setidaknya harus menggunakan mysql_real_escape_stringjika pergi ke rute ini.
Eric Seastrand
masih bagus, saya pasti akan menggunakannya
user7082181
9

Kode Laptop Lift berfungsi dengan baik, tetapi ada beberapa hal yang menurut saya disukai orang.

Penangan database adalah sebuah argumen, bukan hardcode. Menggunakan api mysql baru. Mengganti $ id dengan opsional $ where argumen untuk fleksibilitas. Menggunakan real_escape_string jika ada yang pernah mencoba melakukan injeksi sql dan untuk menghindari kerusakan sederhana yang melibatkan tanda kutip. Menggunakan INSERT table (field...) VALUES (value...)...sintaks sehingga bidang didefinisikan hanya sekali dan kemudian hanya mencantumkan nilai dari setiap baris (implode mengagumkan). Karena Nigel Johnson menunjukkannya, saya menambahkan NULLpenanganan.

Saya menggunakan $array[$key]karena saya khawatir itu akan berubah, tetapi kecuali ada sesuatu yang sangat salah, seharusnya tidak.

<?php
function show_inserts($mysqli,$table, $where=null) {
    $sql="SELECT * FROM `{$table}`".(is_null($where) ? "" : " WHERE ".$where).";";
    $result=$mysqli->query($sql);

    $fields=array();
    foreach ($result->fetch_fields() as $key=>$value) {
        $fields[$key]="`{$value->name}`";
    }

    $values=array();
    while ($row=$result->fetch_row()) {
        $temp=array();
        foreach ($row as $key=>$value) {
            $temp[$key]=($value===null ? 'NULL' : "'".$mysqli->real_escape_string($value)."'");
        }
        $values[]="(".implode(",",$temp).")";
    }
    $num=$result->num_rows;
    return "INSERT `{$table}` (".implode(",",$fields).") VALUES \n".implode(",\n",$values).";";
}
?>
Chinoto Vokro
sumber
Tidak yakin tentang yang hilang INTOpada INSERT INTO {$tables}tetapi tidak ada penanganan null dalam tabel.
Nigel Johnson
1
@NigelJson INTOsepenuhnya opsional . Saya menambahkan penanganan null untuk itu.
Chinoto Vokro
6

Saya menggunakan program SQLYOG di mana saya dapat membuat kueri pemilihan, mengarahkan tangkapan layarke hasil dan memilih ekspor sebagai sql. Ini memberi saya pernyataan insert.

Henrik
sumber
Hanya untuk menghindari kebingungan, dikatakan format sql tetapi sebenarnya mengekspor dalam format mysql.
Kumar Vikramjeet
Terima kasih .... +1 karena ini berhasil untuk saya. Tetapi tidak bisa mendapatkan hanya untuk baris yang dipilih. :( Metode Anda memberikan kueri sisipkan untuk semua baris tabel.
Mukit09
5

Di dalam meja kerja MySQL lakukan hal berikut:

  1. Klik Server> Ekspor Data

  2. Pada Tab Pemilihan Objek pilih skema yang diinginkan.

  3. Selanjutnya, pilih tabel yang diinginkan menggunakan kotak daftar di sebelah kanan skema.

  4. Pilih lokasi file untuk mengekspor skrip.

  5. Klik Selesai.

  6. Arahkan ke file yang baru dibuat dan salin pernyataan sisipkan.

Kevin Bowersox
sumber
ini adalah ekspor tabel lengkap, bukan ekspor baris tertentu
Yehia
4

Anda dapat menggunakan Sequel pro untuk melakukan ini, ada opsi untuk 'get as insert statement' untuk hasil yang diperoleh

flash
sumber
4

Jika Anda ingin mendapatkan "pernyataan insert" untuk tabel Anda, Anda dapat mencoba kode berikut.

SELECT 
    CONCAT(
        GROUP_CONCAT(
            CONCAT(
                'INSERT INTO `your_table` (`field_1`, `field_2`, `...`, `field_n`) VALUES ("',
                `field_1`,
                '", "',
                `field_2`,
                '", "',
                `...`,
                '", "',
                `field_n`,
                '")'
            ) SEPARATOR ';\n'
        ), ';'
    ) as `QUERY`
FROM `your_table`;

Akibatnya, Anda akan memiliki pernyataan dalam:

INSERT INTO your_table( field_1, field_2, ..., field_n) VALUES (value_11, value_12, ..., value_1n);

INSERT INTO your_table( field_1, field_2, ..., field_n) VALUES (value_21, value_22, ..., value_2n);

/ ................................................. .... /

INSERT INTO your_table( field_1, field_2, ..., field_n) VALUES (value_m1, value_m2, ..., value_mn);

, dengan m - jumlah record di tabel_Anda

slava157
sumber
4
Bisakah Anda memberikan jawaban yang lebih banyak daripada sekadar blok kode yang ditempelkan?
Matt Fletcher
ya, tapi ini adalah hardcode, field_ * adalah nama statis. Itu membuat setengah dari pekerjaan, dan itu membuatnya tidak begitu baik
Daniele Cruciani
mengapa GROUP_CONCAT?
sealabr
3

Di PHPMyAdmin Anda dapat:

  1. klik salin pada baris yang ingin Anda ketahui memasukkan pernyataan SQL:

Pilih salin

  1. klik Pratinjau SQL:

Pilih Pratinjau

  1. Anda akan mendapatkan pernyataan insert yang dibuat yang menghasilkannya

Anda dapat menerapkannya pada banyak baris sekaligus jika Anda memilihnya dan mengklik salin dari bagian bawah tabel lalu Pratinjau SQl

Mosab B. Nazli
sumber
Tambahkan lebih banyak penjelasan dan informasi ke jawaban Anda
Ramin eghbalian
2

Untuk pengguna HeidiSQL :

Jika Anda menggunakan HeidiSQL, Anda dapat memilih baris yang Anda inginkan untuk mendapatkan pernyataan insert. Kemudian klik kanan> Ekspor baris kisi> pilih "Salin ke papan klip" untuk "Target keluaran", "Pilihan" untuk "Pilihan Baris" sehingga Anda tidak mengekspor baris lain, "SQL INSERT" untuk "Format keluaran"> Klik OK.

masukkan deskripsi gambar di sini

Pernyataan sisipkan akan ada di dalam clipboard Anda.

jatuh
sumber
1

Dengan PDO Anda bisa melakukannya dengan cara ini.

$stmt = DB::getDB()->query("SELECT * FROM sometable", array());

$array = $stmt->fetchAll(PDO::FETCH_ASSOC);
    $fields = array_keys($array[0]);

    $statement = "INSERT INTO user_profiles_copy (".implode(",",$fields).") VALUES ";
    $statement_values = null;

    foreach ($array as $key => $post) {
        if(isset($statement_values)) {
            $statement_values .= ", \n";
        }

        $values = array_values($post);
        foreach($values as $index => $value) {
            $quoted = str_replace("'","\'",str_replace('"','\"', $value));
            $values[$index] = (!isset($value) ? 'NULL' : "'" . $quoted."'") ;
        }

        $statement_values .= "(".implode(',',$values).")";


    }
    $statement .= $statement_values . ";";

    echo $statement;
Josh Bernfeld
sumber
1

Anda dapat membuat SP dengan kode di bawah ini - ini mendukung NULLS juga.

select 'my_table_name' into @tableName;

/*find column names*/
select GROUP_CONCAT(column_name SEPARATOR ', ') from information_schema.COLUMNS
where table_schema =DATABASE()
and table_name = @tableName
group by table_name
into @columns
;

/*wrap with IFNULL*/
select replace(@columns,',',',IFNULL(') into @selectColumns;
select replace(@selectColumns,',IFNULL(',',\'~NULL~\'),IFNULL(') into @selectColumns;

select concat('IFNULL(',@selectColumns,',\'~NULL~\')') into @selectColumns;

/*RETRIEVE COLUMN DATA FIELDS BY PK*/
SELECT
  CONCAT(
    'SELECT CONCAT_WS(','''\'\',\'\''',' ,
    @selectColumns,
    ') AS all_columns FROM ',@tableName, ' where id = 5 into @values;'
    )
INTO @sql;

PREPARE stmt FROM @sql;
EXECUTE stmt;

/*Create Insert Statement*/
select CONCAT('insert into ',@tableName,' (' , @columns ,') values (\'',@values,'\')') into @prepared;

/*UNWRAP NULLS*/
select replace(@prepared,'\'~NULL~\'','NULL') as statement;
snyman
sumber
0

Saya pikir jawaban yang diberikan oleh Laptop Lift adalah yang terbaik ... tetapi karena tidak ada yang menyarankan pendekatan yang saya gunakan, saya pikir saya harus ikut campur. Saya menggunakan phpMyAdmin untuk mengatur dan mengelola database saya sebagian besar waktu. Di dalamnya, Anda cukup memberi tanda centang di sebelah baris yang Anda inginkan, dan di bagian bawah klik "Ekspor" dan pilih SQL. Ini akan memberi Anda pernyataan INSERT untuk rekaman mana pun yang Anda pilih. Semoga ini membantu.

techtheatre
sumber
-1

Berdasarkan komentar Anda, tujuan Anda adalah memigrasi perubahan database dari lingkungan pengembangan ke lingkungan produksi.

Cara terbaik untuk melakukannya adalah dengan menyimpan perubahan database Anda dalam kode sumber dan akibatnya melacaknya di sistem kontrol sumber Anda seperti git atau svn.

Anda dapat bangun dan menjalankannya dengan cepat menggunakan sesuatu seperti ini: https://github.com/davejkiger/mysql-php-migrations

sebagai solusi khusus yang paling dasar di PHP, Anda dapat menggunakan fungsi seperti ini:

function store_once($table, $unique_fields, $other_fields=array()) {
    $where = "";
    $values = array();
    foreach ($unique_fields as $k => $v) {
        if (!empty($where)) $where .= " && ";
        $where .= "$k=?";
        $values[] = $v;
    }
    $records = query("SELECT * FROM $table WHERE $where", $values);
    if (false == $records) {
        store($table, array_merge($unique_fields, $other_fields));
    }
}

kemudian Anda dapat membuat skrip migrasi yang akan memperbarui lingkungan apa pun sesuai spesifikasi Anda.

Ali Gangji
sumber