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');

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"

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

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.


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;
}

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).";";
}
?>

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.


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.


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


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


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


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.


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;

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;

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.


-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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.