MySQL'de mevcut satır için Ekleme Bildirimi Al


139

MySQL kullanarak sorguyu çalıştırabilirsiniz:

SHOW CREATE TABLE MyTable;

Ve belirtilen tablo için tablo oluştur ifadesini döndürür. Bu, daha önce oluşturulmuş bir tablonuz varsa ve aynı tabloyu başka bir veritabanında oluşturmak istiyorsanız kullanışlıdır.

Zaten var olan bir satır veya satır kümesi için ekleme ifadesini almak mümkün müdür? Bazı tabloların birçok sütunu vardır ve insert deyimini yazmak zorunda kalmadan veya verileri CSV'ye dışa aktarıp aynı verileri içe aktarmadan satırları başka bir veritabanına aktarmak için bir insert deyimi alabilmem iyi olur. diğer veritabanına.

Sadece açıklığa kavuşturmak için, istediğim şu şekilde çalışacak bir şey:

SHOW INSERT Select * FROM MyTable WHERE ID = 10;

Ve aşağıdakiler benim için geri döndü:

INSERT INTO MyTable(ID,Col1,Col2,Col3) VALUES (10,'hello world','some value','2010-10-20');

DB'ye bağlanmak için hangi aracı kullanıyorsunuz? Bazı programlar bu tür şablonlar sağlar.
GôTô

2
@kibbee, bunun için herhangi bir çözüm buldunuz mu ??
Hasina

2
Bilgi mysql>isteminden INSERT ifadelerini gösteren bir cevap isterim . Şimdiye kadar hiçbiri bunu yapmıyor.
Bob Stein

insert deyimini programlı olarak almak için bunun için herhangi bir çözüm buldunuz mu?
Vaibhav Jain

Yanıtlar:


156

INSERTMySQL konsolundan ifadeleri almanın bir yolu yok gibi görünüyor , ancak Rob'un önerdiği gibi mysqldump kullanarak alabilirsiniz . -tTablo oluşturmayı atlamak için belirtin .

mysqldump -t -u MyUserName -pMyPassword MyDatabase MyTable --where="ID = 10"

Mysqldump hatasını alırsanız buna bakın: 'SELECT @@ GTID_MODE' yürütülemedi: Bilinmeyen sistem değişkeni 'GTID_MODE' (1193) gist.github.com/arun057/5556563
Daniel Schaffer

10
Ekleme ifadesiyle alan / sütun adlarını istiyorsanız "--complete-insert" ekleyebilirsiniz
MeatPopsicle

3
tek

ve --hex-blobblob sütunlarınız varsa (örneğin a bit(1)), dize olarak yazar, aksi takdirde Unknown command '\0'INSERT yürütülürken hataya neden olabilir .
moffeltje

79

MySQL Workbench'te herhangi bir tek tablo sorgusunun sonuçlarını bir INSERTdeyimler listesi olarak dışa aktarabilirsiniz . Sadece sorguyu çalıştırın ve sonra:

Dışa aktar düğmesinin anlık görüntüsü

  1. Export/Importsonuçların yukarısındaki disketi tıklayın
  2. hedef dosyaya bir ad verin
  3. Formatseçmek için pencerenin altındaSQL INSERT statements
  4. Tıklayın Save
  5. Tıklayın Export

2
Ayrıca, sağdaki simge az önce oluşturduğunuz dışa aktarmayı içe aktarmak için çok kullanışlıdır. Çok güzel bir özellik. Tek zor kısım, simgelere yalnızca bir seçimden sonra sonuç kümesi panelinden erişebilmenizdir.
Half_Duplex

13

Tabloyu SHRE CREATE TABLE MyTable tarafından üretilen SQL ile kopyaladığınızdan, verileri yeni tabloya yüklemek için aşağıdakileri yapabilirsiniz.

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

INSERT ifadelerini gerçekten istiyorsanız, bildiğim tek yol mysqldump http://dev.mysql.com/doc/refman/5.1/en/mysqldump.htm kullanmaktır . Yalnızca belirli bir tablo için verileri dökmek ve hatta satırları sınırlamak için seçenekler sunabilirsiniz.


Söz konusu veritabanları fiziksel olarak farklı makinelerde, farklı ağlarda bulunur, bu nedenle bu yöntem benim için işe yaramaz, ancak aynı MySQL
Kibbee

Veri alt kümelerini makineler arasında programlı olarak taşımaya mı çalışıyorsunuz? Verileri yansıtmak için ikinci makineyi bağlayıp alt kümelerinizi köle üzerindeki veritabanları arasında taşıyamadınız mı?
Rob Prouse

1
Argüman uğruna, Zaman Dilimlerini içeren bir tablom olduğunu varsayalım. Şimdi, bazı nedenlerden dolayı yeni bir saat dilimi oluşturulur (belki 15 dakikalık bir farkla veya bunun gibi bir şeyle). Bu yüzden yeni satırı, yeni saat dilimi hakkındaki tüm bilgileri içeren geliştirme veritabanına ekledim ve gerekli tüm testleri yapın. Bu saat dilimi bilgisini üretim veritabanına taşıma zamanı geldiğinde sıfırdan bir ekleme ifadesi oluşturmam veya bir dışa aktarma / içe aktarma yapmam gerekiyor. Sadece eki almak ve daha sonra yeni saat dilimini canlı hale getirmek için komut dosyalarına dahil etmek güzel olurdu.
Kibbee

1
Orijinal ekim yok çünkü bir GUI aracı kullanarak eklemiş olabilirim veya eklediğim orijinal değerlerden 3 kez değiştirmek zorunda kalabilirdim.
Kibbee

1
Aynı makinedeki veritabanları için basit bir çözüme ihtiyacım vardı ve google beni buraya getirdi. Orijinal sorunun bağlamında olmasa bile, bu cevap için minnettarım :)
Jason McCarrell

10

Bunu yapacak bir php fonksiyonu yazdım. Bir kaydın bir geçmiş tablosu için silindikten sonra değiştirilmesi gerektiğinde bir insert deyimi yapmak gerekiyordu:

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
Bu çözüm oldukça kırılgandır. Örneğin, kayıtlarınızdan biri adı içeriyorsa O' Malley, oluşturulan sorgularda tekli tırnaklar eşleşmediği için sözdizimi hataları olur. En azından mysql_real_escape_stringbu rotaya giderken kullanmalısınız .
Eric Seastrand

hala güzel şeyler, ben kesin kullanacağım
user7082181

9

Laptop Lift'in kodu iyi çalışıyor, ancak insanların beğenebileceğini düşündüğüm birkaç şey vardı.

Veritabanı işleyicisi sabit kodlanmamış bir bağımsız değişkendir. Yeni mysql api kullanılır. $ İd yerine esneklik argümanı isteğe bağlı bir $ ile değiştirildi. Herkes sql enjeksiyon yapmaya ve tırnak içeren basit kırılma önlemek için çalıştı durumunda real_escape_string kullanılır. INSERT table (field...) VALUES (value...)...Alanların yalnızca bir kez tanımlanması için sözdizimini kullandıktan sonra her satırın değerlerini listeleyin (implode harika). Nigel Johnson dikkat çektiğinden, NULLyol tutuşunu ekledim .

Kullandım $array[$key]çünkü bir şekilde değişebileceğinden endişelendim, ama bir şey korkunç bir şekilde yanlış değilse, yine de olmamalıdır.

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

Hakkında eksik değil emin INTOüzerinde INSERT INTO {$tables}ancak tabloda null hiçbir işleme yoktur.
Nigel Johnson

1
@NigelJohnson INTOtamamen isteğe bağlıdır . Buna boş değerler ekledim.
Chinoto Vokro

6

Ben bir seçme sorgusu yapmak , sonuçlara işaret ve sql olarak ihracat seçin SQLYOG programı kullanın ekran görüntüsü. Bu bana ekleme ifadeleri verir.


Sadece karışıklığı önlemek için sql formatı diyor ama aslında mysql formatında dışa aktarıyor.
Kumar Vikramjeet

Teşekkürler .... +1 benim için çalıştı. Ancak yalnızca seçilen satırlar için alınamadı. :( Tablonun tüm satırları için ekleme sorgusu verme yönteminiz
Mukit09

5

MySQL çalışma tezgahı içerisinde aşağıdakileri gerçekleştirin:

  1. Sunucu> Veri Dışa Aktarma'yı tıklayın

  2. Nesne Seçimi Sekmesinde istediğiniz şemayı seçin.

  3. Ardından, şemanın sağındaki liste kutusunu kullanarak istediğiniz tabloları seçin.

  4. Komut dosyasını dışa aktarmak için bir dosya konumu seçin.

  5. Bitir'e tıklayın.

  6. Yeni oluşturulan dosyaya gidin ve insert deyimlerini kopyalayın.


Bu tam bir tablo ihracat, belirli bir satır ihracat değil
Yehia

4

Tablonuz için "insert deyimi" almak istiyorsanız, aşağıdaki kodu deneyebilirsiniz.

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

Sonuç olarak, insers deyiminiz olacaktır:

INSERT INTO your_table( field_1, field_2, ..., field_n) DEĞERLER (value_11, value_12, ..., value_1n);

INSERT INTO your_table( field_1, field_2, ..., field_n) DEĞERLER (value_21, value_22, ..., value_2n);

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

INSERT INTO your_table( field_1, field_2, ..., field_n) DEĞERLER (value_m1, value_m2, ..., value_mn);

, burada m - tablonuzdaki kayıt sayısı


4
Yanıtınıza yapıştırılmış bir kod bloğundan biraz daha fazla bilgi verebilir misiniz?
Matt Fletcher

evet, ama bu kodlanmış, field_ * statik isimlerdir.
İşin

neden GROUP_CONCAT?
sealabr

3

Bunu yapmak için Sequel pro'yu kullanabilirsiniz, elde edilen sonuçlar için 'insert ifadesi olarak al' seçeneği vardır


3

PHPMyAdmin'de şunları yapabilirsiniz:

  1. onun insert deyimleri SQL bilmek istediğiniz satırda kopya tıklayın:

Kopya seçin

  1. SQL Önizlemesi'ni tıklayın:

Önizleme'yi seçin

  1. onu oluşturan oluşturulan insert deyimini alacaksınız

Bunları seçip tablonun alt kısmından kopyala'yı ve ardından Önizleme SQl'sini tıklarsanız, bunu aynı anda birçok satıra uygulayabilirsiniz


Cevabınıza daha fazla açıklama ve bilgi ekleyin
Ramin eghbalian

2

HeidiSQL kullanıcıları için :

HeidiSQL kullanıyorsanız, insert deyimi almak istediğiniz satır (lar) ı seçebilirsiniz. Ardından sağ tıklayın> Izgara satırlarını dışa aktar> "Çıktı hedefi" için "Panoya kopyala" yı, "Satır Seçimi" için "Seçim" i seçin, böylece diğer satırları dışa aktarmazsınız, "Çıktı formatı" için "SQL INSERTs"> Tamam'ı tıklatın.

resim açıklamasını buraya girin

İnsert deyimi panonuzun içinde olacaktır.


1

PDO ile bu şekilde yapabilirsiniz.

$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

Aşağıdaki kodla bir SP oluşturabilirsiniz - NULLS'u da destekler.

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

Ben Laptop Lifts tarafından verilen cevap en iyisi olduğunu düşünüyorum ... ama kimse kullandığım yaklaşımı önerdi, ben chime gerektiğini düşündüm. Çoğu zaman veritabanlarımı kurmak ve yönetmek için phpMyAdmin kullanın. İçinde, istediğiniz satırların yanına onay işaretleri koyabilir ve alt kısımda "Dışa Aktar" ı tıklayıp SQL'i seçebilirsiniz. Seçtiğiniz kayıtlar için size INSERT ifadeleri verecektir. Bu yardımcı olur umarım.


-1

Yorumlarınıza dayanarak, hedefiniz veritabanı değişikliklerini bir geliştirme ortamından bir üretim ortamına taşımaktır.

Bunu yapmanın en iyi yolu, veritabanı değişikliklerinizi kaynak kodunuzda tutmak ve sonuç olarak git veya svn gibi kaynak denetim sisteminizde izlemektir.

şuna benzer bir şeyle hızlı bir şekilde çalışmaya başlayabilirsiniz: https://github.com/davejkiger/mysql-php-migrations

PHP'de çok temel bir özel çözüm olarak, böyle bir işlevi kullanabilirsiniz:

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

herhangi bir ortamı belirtimlerinize göre güncelleyecek bir geçiş komut dosyası oluşturabilirsiniz.

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.