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');
mysql>
prompt. Sejauh ini tidak ada yang melakukannya.Jawaban:
Sepertinya tidak ada cara untuk mendapatkan
INSERT
pernyataan dari konsol MySQL, tetapi Anda bisa mendapatkannya menggunakan mysqldump seperti yang disarankan Rob. Tentukan-t
untuk menghilangkan pembuatan tabel.mysqldump -t -u MyUserName -pMyPassword MyDatabase MyTable --where="ID = 10"
sumber
--hex-blob
jika Anda memiliki kolom blob (misalnya abit(1)
), ini akan menuliskannya sebagai string sebaliknya, yang dapat mengakibatkanUnknown command '\0'
kesalahan saat menjalankan INSERT.Di MySQL Workbench Anda dapat mengekspor hasil kueri tabel tunggal mana pun sebagai daftar
INSERT
pernyataan. Jalankan saja kueri, lalu:Export/Import
hasil di atasFormat
memilihSQL INSERT statements
Save
Export
sumber
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.
sumber
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; }
sumber
O' Malley
, kueri yang dihasilkan akan mengalami kesalahan sintaksis karena tanda kutip tunggal tidak cocok. Anda setidaknya harus menggunakanmysql_real_escape_string
jika pergi ke rute ini.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 menambahkanNULL
penanganan.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).";"; } ?>
sumber
INTO
padaINSERT INTO {$tables}
tetapi tidak ada penanganan null dalam tabel.INTO
sepenuhnya opsional . Saya menambahkan penanganan null untuk itu.Saya menggunakan program SQLYOG di mana saya dapat membuat kueri pemilihan, mengarahkan ke hasil dan memilih ekspor sebagai sql. Ini memberi saya pernyataan insert.
sumber
Di dalam meja kerja MySQL lakukan hal berikut:
Klik Server> Ekspor Data
Pada Tab Pemilihan Objek pilih skema yang diinginkan.
Selanjutnya, pilih tabel yang diinginkan menggunakan kotak daftar di sebelah kanan skema.
Pilih lokasi file untuk mengekspor skrip.
Klik Selesai.
Arahkan ke file yang baru dibuat dan salin pernyataan sisipkan.
sumber
Anda dapat menggunakan Sequel pro untuk melakukan ini, ada opsi untuk 'get as insert statement' untuk hasil yang diperoleh
sumber
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
sumber
Di PHPMyAdmin Anda dapat:
Anda dapat menerapkannya pada banyak baris sekaligus jika Anda memilihnya dan mengklik salin dari bagian bawah tabel lalu Pratinjau SQl
sumber
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.
Pernyataan sisipkan akan ada di dalam clipboard Anda.
sumber
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;
sumber
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;
sumber
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.
sumber
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.
sumber