Получить инструкцию вставки для существующей строки в MySQL


139

Используя MySQL, я могу выполнить запрос:

SHOW CREATE TABLE MyTable;

И он вернет оператор создания таблицы для указанной таблицы. Это полезно, если у вас уже есть созданная таблица, и вы хотите создать такую ​​же таблицу в другой базе данных.

Можно ли получить оператор вставки для уже существующей строки или набора строк? В некоторых таблицах много столбцов, и было бы неплохо, если бы у меня была возможность получить оператор вставки для переноса строк в другую базу данных без необходимости записывать оператор вставки или без экспорта данных в CSV, а затем импортировать те же данные в другую базу данных.

Просто чтобы уточнить, что я хочу, это то, что будет работать следующим образом:

SHOW INSERT Select * FROM MyTable WHERE ID = 10;

И верните мне следующее:

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

Какой инструмент вы используете для подключения к БД? Некоторые программы предоставляют такие шаблоны.
GôTô 20.10.10

2
@ kibbee, вы нашли какое-нибудь решение для этого ??
Хасина

2
Хотелось бы получить ответ, который показал заявления INSERT из mysql>приглашения. Никто пока не делает.
Боб Стейн

Вы нашли какое-либо решение для этого, чтобы получить оператор вставки программно?
Вайбхав Джайн

Ответы:


156

Кажется, нет способа получить INSERTоператоры из консоли MySQL, но вы можете получить их, используя mysqldump, как предложил Роб. Укажите, -tчтобы пропустить создание таблицы.

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

Посмотрите на это, если вы получите сообщение об ошибке mysqldump: не удалось выполнить «SELECT @@ GTID_MODE»: неизвестная системная переменная «GTID_MODE» (1193) gist.github.com/arun057/5556563
Даниэль Шаффер,

10
И вы можете добавить «--complete-insert», если вы хотите, чтобы имена полей / столбцов
MeatPopsicle


и --hex-blobесли у вас есть столбцы BLOB-объектов (например, a bit(1)), в противном случае он будет записан в виде строки, что может привести к Unknown command '\0'ошибке при выполнении INSERT.
моффельте

79

В MySQL Workbench вы можете экспортировать результаты любого запроса в одну таблицу в виде списка INSERTоператоров. Просто запустите запрос, а затем:

Снимок кнопки экспорта

  1. нажмите на дискету рядом Export/Importс результатами
  2. дать имя целевому файлу
  3. внизу окна, для FormatвыбораSQL INSERT statements
  4. щелчок Save
  5. щелчок Export

2
Кроме того, значок справа очень удобен для импорта только что созданного экспорта. Очень приятная особенность. Единственная сложность в том, что вы можете получить доступ только к значкам на панели набора результатов после выбора.
Полудуплекс

13

Поскольку вы скопировали таблицу с помощью SQL, созданного SHOW CREATE TABLE MyTable , вы можете просто сделать следующее, чтобы загрузить данные в новую таблицу.

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

Если вам действительно нужны операторы INSERT, то единственный известный мне способ - использовать mysqldump http://dev.mysql.com/doc/refman/5.1/en/mysqldump.htm . Вы можете дать ему возможность просто выводить данные для конкретной таблицы и даже ограничивать строки.


Базы данных, о которых идет речь, существуют на физически разных машинах, в разных сетях, поэтому этот метод не
подойдет

Вы пытаетесь программно перемещать подмножества данных между компьютерами? Не могли бы вы подчинить второй компьютер для зеркального отображения данных, а затем переместить свои подмножества между базами данных на ведомом устройстве?
Роб Проус

1
Давайте, ради аргумента, скажем, у меня есть таблица, которая содержит часовые пояса. Теперь по какой-то причине создается новый часовой пояс (возможно, со смещением в 15 минут или что-то в этом роде). Поэтому я добавляю новую строку в базу данных разработки, которая содержит всю информацию о новом часовом поясе, и делаю все необходимое тестирование. Когда приходит время перенести эту информацию о часовом поясе в производственную базу данных, я должен создать оператор вставки с нуля или выполнить экспорт / импорт. Было бы неплохо иметь возможность просто получить вставку, а затем включить ее в сценарии, чтобы оживить новый часовой пояс.
Кибби

1
У меня нет оригинальной вставки, потому что я, возможно, вставил ее, используя инструмент с графическим интерфейсом, или мне, возможно, пришлось изменить ее 3 раза по сравнению с оригинальными значениями, которые я вставил.
Кибби

1
Мне понадобилось простое решение для баз данных на одном компьютере, и Google привел меня сюда. Поэтому я благодарен за этот ответ, даже если он был вне контекста исходного вопроса :)
Джейсон МакКаррелл

10

Я написал функцию PHP, которая будет делать это. Мне нужно было сделать оператор вставки на случай, если запись должна быть заменена после удаления для таблицы истории:

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
Это решение довольно хрупкое. Например, если одна из ваших записей содержит имя O' Malley, сгенерированные запросы будут иметь синтаксические ошибки из-за несоответствия одинарных кавычек. Вы должны по крайней мере использовать, mysql_real_escape_stringесли идти по этому маршруту.
Эрик Сеастранд

все еще хороший материал, я буду использовать его наверняка
user7082181

9

Код ноутбука Lift работает нормально, но я подумал, что людям могут понравиться некоторые вещи.

Обработчик базы данных является аргументом, а не жестко закодированным. Использовал новый API MySQL. Заменил $ id на необязательный аргумент $ where для большей гибкости. Использовал real_escape_string на тот случай, если кто-либо когда-либо пытался сделать инъекцию sql и избежать простых поломок с кавычками. ИспользовалINSERT table (field...) VALUES (value...)... синтаксис, чтобы поля определялись только один раз, а затем просто перечисляли значения каждой строки (implode - это круто). Поскольку Найджел Джонсон указал на это, я добавил NULLобработку.

Я использовал, $array[$key]потому что я волновался, что это может как-то измениться, но если что-то не так ужасно, это не должно так или иначе.

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

Не уверен насчет пропущенного INTOвключения, INSERT INTO {$tables}но в таблице нет обработки нулей.
Найджел Джонсон

1
@NigelJohnson не INTOявляется обязательным . Я добавил обработку нулей к нему.
Чиното Вокро

6

Я использую программу SQLYOG, где я могу сделать запрос выбора, указать на Скриншотрезультаты и выбрать экспорт как sql. Это дает мне инструкции для вставки.


Просто, чтобы избежать путаницы, он говорит, что формат SQL, но на самом деле экспортируется в формате MySQL.
Кумар Викрамджит

Спасибо .... +1 как у меня сработало. Но не мог получить только для выбранных строк. :( Ваш метод дает запрос вставки для всех строк таблицы.
Mukit09

5

На рабочем месте MySQL выполните следующее:

  1. Нажмите Сервер> Экспорт данных

  2. На вкладке «Выбор объекта» выберите нужную схему.

  3. Затем выберите нужные таблицы с помощью списка справа от схемы.

  4. Выберите местоположение файла для экспорта скрипта.

  5. Нажмите Готово.

  6. Перейдите к вновь созданному файлу и скопируйте операторы вставки.


это полный экспорт таблиц, а не экспорт отдельных строк
Yehia

4

Если вы хотите получить «вставку оператора» для своей таблицы, вы можете попробовать следующий код.

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

В результате вы получите оператор вставки:

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

где m - количество записей в your_table


4
Не могли бы вы предоставить немного больше ответа, чем просто вставленный блок кода?
Мэтт Флетчер

да, но это жестко, field_ * являются статическими именами. Это делает половину работы, и это делает это не так хорошо
Даниэле Кручиани

почему GROUP_CONCAT?
sealabr

3

Вы можете использовать Sequel Pro, чтобы сделать это, есть возможность «получить как вставить заявление» для полученных результатов


3

В PHPMyAdmin вы можете:

  1. нажмите кнопку копирования в строке, которую вы хотите знать его операторы вставки SQL:

Выберите копию

  1. нажмите Предварительный просмотр SQL:

Выберите Предварительный просмотр

  1. вы получите созданный оператор вставки, который генерирует его

Вы можете применить это ко многим строкам одновременно, если вы выделите их и нажмете кнопку «Копировать» в нижней части таблицы, а затем «Предварительный просмотр SQl».


Добавьте больше объяснений и информации к своему ответу
Рамин Эгбалиан

2

Для пользователей HeidiSQL :

Если вы используете HeidiSQL, вы можете выбрать строки, которые вы хотите получить оператором вставки. Затем щелкните правой кнопкой мыши> Экспортировать строки сетки> выберите «Копировать в буфер» для «Вывод цели», «Выбор» для «Выбор строки», чтобы не экспортировать другие строки, «SQL INSERT» для «Формат вывода»> Нажмите «ОК».

введите описание изображения здесь

Оператор вставки будет внутри вашего буфера обмена.


1

С PDO вы можете сделать это таким образом.

$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

Вы можете создать SP с кодом ниже - он также поддерживает 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;

0

Я думаю, что ответ, предоставленный Laptop Lifts, является лучшим ... но так как никто не предложил подход, который я использую, я решил, что должен вмешаться. Я использую phpMyAdmin для настройки и управления своими базами данных большую часть времени. В нем вы можете просто поставить галочки рядом с нужными строками, а внизу нажать «Экспорт» и выбрать SQL. Это даст вам инструкции INSERT для любых выбранных вами записей. Надеюсь это поможет.


-1

Исходя из ваших комментариев, ваша цель - перенести изменения базы данных из среды разработки в производственную среду.

Лучший способ сделать это - сохранить изменения базы данных в исходном коде и, следовательно, отслеживать их в вашей системе контроля версий, такой как git или svn.

вы можете быстро приступить к работе с чем-то вроде этого: https://github.com/davejkiger/mysql-php-migrations

как очень простое пользовательское решение в PHP, вы можете использовать такую ​​функцию:

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

Затем вы можете создать скрипт миграции, который обновит любую среду в соответствии с вашими требованиями.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.