Получить инструкцию вставки для существующей строки в MySQL - PullRequest
111 голосов
/ 20 октября 2010

Используя 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');

Ответы [ 14 ]

1 голос
/ 20 января 2016

Вы можете создать 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;
1 голос
/ 21 июля 2015

С помощью 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;
0 голосов
/ 14 октября 2012

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

0 голосов
/ 02 июня 2012

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

Лучший способ сделать это - сохранить изменения базы данных в исходном коде и, следовательно, отслеживать их в вашей системе контроля версий, такой как 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));
    }
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...