2010-10-20 18 views
77

MySQL mogę uruchomić kwerendę:Get INSERT dla istniejących wierszy w MySQL

SHOW CREATE TABLE MyTable; 

I zwróci CREATE TABLE dla specificed tabeli. Jest to przydatne, jeśli masz już utworzoną tabelę i chcesz utworzyć tę samą tabelę w innej bazie danych.

Czy można uzyskać instrukcję wstawiania dla już istniejącego wiersza lub zestawu wierszy? Niektóre tabele mają wiele kolumn i miło byłoby móc uzyskać instrukcję wstawiania, aby przenieść wiersze do innej bazy danych bez konieczności wypisywania instrukcji wstawiania lub bez eksportowania danych do pliku CSV, a następnie importowania tych samych danych do innej bazy danych.

Wystarczy, aby wyjaśnić, co chcę jest coś, co będzie działać w następujący sposób:

SHOW INSERT Select * FROM MyTable WHERE ID = 10; 

i mają następujące wrócił do mnie:

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

Jakiego narzędzia używasz do połączenia z DB? Niektóre programy udostępniają takie szablony. –

+1

@kibbee, znalazłeś jakieś rozwiązanie? – Hasina

+2

Chciałbym odpowiedzi, która pokazałaby instrukcje INSERT z podpowiedzi 'mysql>'. Żadne jak dotąd nie. –

Odpowiedz

9

Ponieważ kopiowane tabelę z SQL produkowanej przez POKAŻ UTWÓRZ TABELĘ MyTable, możesz po prostu wykonać następujące czynności, aby załadować dane do nowej tabeli.

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

Jeśli naprawdę chcesz sprawozdań INSERT, to jedynym sposobem, że wiem o jest użycie mysqldumphttp://dev.mysql.com/doc/refman/5.1/en/mysqldump.htm. Możesz dać jej opcje, aby po prostu zrzucić dane dla konkretnej tabeli, a nawet ograniczyć wiersze.

+0

Te bazy danych istnieją na fizycznie różnych maszynach, w różnych sieciach, więc ta metoda nie będzie działać dla mnie, ale działa dobrze dla baz danych uruchomionych na tym samym wystąpieniu MySQL – Kibbee

+0

Czy próbujesz programowo przenieść podzestawy danych między komputerami? Czy nie mógłbyś podporządkować drugiej maszyny lustrzanym danym, a potem przenieść podzestawy między bazami danych na niewolniku? –

+0

Załóżmy, dla przykładu, że mam tabelę zawierającą Strefy czasowe. Teraz z jakiegoś powodu tworzona jest nowa strefa czasowa (być może z 15-minutowym przesunięciem lub czymś w tym stylu). Dodaję więc nowy wiersz do rozwojowej bazy danych, która zawiera wszystkie informacje o nowej strefie czasowej i wykonuję wszystkie niezbędne testy. Kiedy przychodzi czas na przeniesienie informacji strefy czasowej do produkcyjnej bazy danych, muszę utworzyć instrukcję wstawiania od zera lub wykonać eksport/import. Byłoby miło móc po prostu wstawić insert, a następnie dołączyć go do skryptów, aby wprowadzić nową strefę czasową na żywo. – Kibbee

5

Używam programu SQLYOG, gdzie mogę wykonać zapytanie wybrane, wskazać na screenshot wyniki i wybrać eksport jako sql. To daje mi instrukcje wstawiania.

+0

Aby uniknąć nieporozumień, mówi format sql, ale faktycznie eksportuje w formacie mysql. –

-1

Na podstawie twoich komentarzy, Twoim celem jest migracja zmian w bazie danych ze środowiska programistycznego do środowiska produkcyjnego.

Najlepszym sposobem na to jest zachowanie zmian w bazie danych w kodzie źródłowym iw konsekwencji śledzenie ich w systemie kontroli źródła, takim jak git lub svn.

można wstać i działa szybko z czymś takim: https://github.com/davejkiger/mysql-php-migrations

jako bardzo zasadowym roztworze niestandardowego w PHP, można użyć funkcji takich jak to:

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

następnie można utworzyć skrypt migracji, który zaktualizuje każde środowisko do twoich specyfikacji.

10

Napisałem funkcję php, która to zrobi. Musiałem zrobić INSERT w przypadku potrzebuje rekord należy wymienić po delecji na stole historia:

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

zaoszczędziło mi dużo czasu - właśnie to przyjechałem tu szukając :) –

+1

To rozwiązanie jest dość kruche. Na przykład, jeśli jeden z twoich rekordów zawiera nazwę 'O 'Malley', wygenerowane zapytania będą zawierały błędy składniowe spowodowane niedopasowaniem pojedynczych cudzysłowów. Powinieneś przynajmniej używać 'mysql_real_escape_string', jeśli wybierasz tę trasę. – Eric

0

myślę, że odpowiedź udzielana przez Laptop Wyciągi jest najlepszy ... ale ponieważ nikt nie zaproponował podejście, które Używam, pomyślałem, że powinienem dzwonić. Używam phpMyAdmin, aby skonfigurować i zarządzać moimi bazami danych przez większość czasu. Możesz w nim po prostu umieścić znaczniki wyboru obok żądanych wierszy, a na dole kliknąć "Eksportuj" i wybrać SQL. Da Ci instrukcje INSERT dla dowolnie wybranych rekordów. Mam nadzieję że to pomoże.

9

Kod na laptopie działa dobrze, ale było kilka rzeczy, które według mnie ludzie mogą lubić.

Obsługa bazy danych to argument, a nie na stałe. Użyto nowego mysql api. Zastąpiono $ id opcjonalnym argumentem $ where dla elastyczności. Użył real_escape_string na wypadek, gdyby ktoś próbował kiedykolwiek wykonać wtrysk sql i aby uniknąć prostych pęknięć z użyciem cytatów. Użyto składni INSERT table (field...) VALUES (value...)..., aby pola były zdefiniowane tylko raz, a następnie wylistować wartości każdego wiersza (implode is awesome). Ponieważ Nigel Johnson to wskazał, dodałem obsługę NULL.

Użyłem $array[$key], ponieważ obawiałem się, że może się jakoś zmienić, ale jeśli coś jest nie w porządku, nie powinno tak być.

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

Nie jestem pewien o brakującym 'INTO' na' INSERT INTO {$ tables} ', ale nie ma obsługi zer w tabeli. –

+0

@NigelJohnson 'INTO' jest całkowicie [opcjonalnie] (http://dev.mysql.com/doc/refman/5.5/en/insert.html). Dodałem do niego obsługę zer. –

101

Tam nie wydaje się być sposób, aby uzyskać INSERT sprawozdania z konsoli MySQL, ale można się do nich za pomocą mysqldump jak Rob zasugerował. Podaj -t, aby pominąć tworzenie tabeli.

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

Zobacz, jeśli pojawi się błąd mysqldump: Nie można wykonać "SELECT @@ GTID_MODE": Nieznana zmienna systemowa "GTID_MODE" (1193) https://gist.github.com/arun057/5556563 –

+2

Możesz dodać "- -complete-insert "jeśli chcesz nazwy pól/kolumn z instrukcją insert – MeatPopsicle

+1

- pojedyncza transakcja – FelikZ

3

można używać Sequel pro to zrobić, nie ma opcji, aby 'dostać jak INSERT' dla wyników uzyskanych

+0

NOWA wskazówka. Dodano zrzut ekranu ;-) – ow3n

5

ciągu MySQL pracy ławce wykonać następujące czynności:

  1. Kliknij opcję Serwer> Eksport danych

  2. Na karcie Wybór obiektu wybierz żądany schemat.

  3. Następnie wybierz żądane tabele, korzystając z pola listy po prawej stronie schematu.

  4. Wybierz lokalizację pliku, aby wyeksportować skrypt.

  5. Kliknij przycisk Zakończ.

  6. Przejdź do nowo utworzonego pliku i skopiuj instrukcje wstawiania.

0

Dzięki ChNP możesz to zrobić w ten sposób.

$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

Można utworzyć SP z poniższym kodem - obsługuje również NULLS.

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

w MySQL Workbench można wyeksportować wyniki jakichkolwiek zapytania pojedynczej tabeli w postaci listy INSERT wypowiedzi.Wystarczy uruchomić kwerendę, a następnie:

Snapshot of export button

  1. kliknij na dyskietce blisko Export/Import powyżej wyników
  2. dać plik docelowy nazwę
  3. w dolnej części okna, na Format wybierz SQL INSERT statements
  4. kliknięcie Save
  5. kliknięcie Export
1

Jeśli chcesz otrzymać "instrukcję wstawienia" dla swojego stołu, możesz wypróbować poniższy kod.

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

W rezultacie, trzeba będzie insers oświadczenie:

wstawić do 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);

, gdzie m - liczba rekordów w Twojej_ścieżce

+4

Czy mógłbyś podać coś więcej niż odpowiedź na wklejony blok kodu? –