Отримати вкладку Insert для існуючого рядка в 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ô

2
@kibbee, Ви знайшли рішення для цього ??
Хасіна

2
Дуже сподобався би відповідь, яка показала заяви INSERT з mysql>підказки. Ніхто поки що не робить.
Боб Штейн

Ви знайшли рішення для цього, щоб програмно отримати оператор insert?
Vaibhav Jain

Відповіді:


155

Здається, не існує способу отримати 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
Daniel Schaffer

10
І ви можете додати "--complete-insert", якщо ви хочете, щоб назви полів / стовпців із
записом "

3
--single-транзакція
FelikZ

і --hex-blobякщо у вас є стовпчики blob (наприклад, a bit(1)), він записує його як рядок інакше, що може призвести до Unknown command '\0'помилки при виконанні INSERT.
moffeltje

79

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

Знімок кнопки експорту

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

2
Також піктограма праворуч дуже зручна для імпортування створеного вами експорту. Дуже приємна особливість. Єдина складна частина полягає в тому, що ви можете отримати доступ до піктограм лише з панелі набору результатів після вибору.
Half_Duplex

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/uk/mysqldump.htm . Ви можете дати йому можливість просто скидати дані для певної таблиці та навіть обмежувати рядки.


Проблемні бази даних існують на фізично різних машинах, у різних мережах, тому цей метод не працює для мене, але працює чудово для баз даних, що працюють на тому ж екземплярі MySQL
Kibbee

Ви намагаєтесь програмно переміщувати підмножини даних між машинами? Не могли б ви невільницю другої машини віддзеркалити дані, а потім перенести підмножини між базами даних на підлеглому?
Роб Прус

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якщо їдете цим маршрутом.
Eric Seastrand

все ще приємні речі, я буду використовувати його точно
user7082181

9

Код Lafttop Lift працює чудово, але мені було кілька речей, які я подумав, що людям це може сподобатися.

Обробник бази даних є аргументом, а не жорстким кодом. Використовували новий mysql api. Замінено $ id на необов'язковий $, де аргумент для гнучкості. Використовується real_escape_string у випадку, якщо хтось коли-небудь намагався зробити інжекцію sql та уникнути простих поломок, що включають цитати. Використовували INSERT table (field...) VALUES (value...)...синтаксис, щоб поля визначалися лише один раз, а потім просто перелічували значення кожного рядка (імплодея є приголомшливою). Оскільки Найджел Джонсон вказав на це, я додав 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абсолютно необов’язковий . Я додав до цього обробку нулів.
Chinoto Vokro

6

Я використовую програму SQLYOG, де я можу зробити запит на вибір, вказати на скріншотрезультати та вибрати експорт як sql. Це дає мені вставні заяви.


Просто щоб уникнути плутанини, він каже, що формат sql, але він фактично експортує у mysql формат.
Kumar Vikramjeet

Дякую .... +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 - кількість записів у вашому_таблиці


4
Чи можете ви надати трохи більше відповіді, ніж просто вставлений блок коду?
Метт Флетчер

Так, але це жорстко закодовано, field_ * - це статичні імена. Це робить половину роботи, і це робить її не так добре
Даніеле Крушані

чому GROUP_CONCAT?
sealabr

3

ви можете використовувати Sequel pro для цього, є можливість "отримати як вкладення заяви" для отриманих результатів


3

У PHPMyAdmin ви можете:

  1. клацніть копію на рядку, який ви хочете знати, про його вставки заяви SQL:

Виберіть копію

  1. натисніть Попередній перегляд SQL:

Виберіть Попередній перегляд

  1. ви отримаєте створений оператор вставки, який його генерує

Ви можете застосувати це до кількох рядків одночасно, якщо ви виберете їх і натисніть копію знизу таблиці, а потім попередній перегляд SQl


Додайте більше пояснень та інформації до своєї відповіді
Ramin eghbalian

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;

1

Для користувачів HeidiSQL :

Якщо ви використовуєте HeidiSQL, ви можете вибрати рядки, які ви хочете отримати. Потім клацніть правою кнопкою миші> Експорт рядків сітки> виберіть "Копіювати у буфер обміну" для "Вихідної мети", "Виділення" для "Вибір рядка", щоб не експортувати інші рядки, "SQL ВСТАВКИ" для "Формат виводу"> Клацніть ОК.

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

Заява вставки буде знаходитися всередині вашого буфера обміну.


0

Я думаю, що відповідь, яку надає Laptop Lifts, найкраща ... але оскільки ніхто не запропонував підходу, який я використовую, я зрозумів, що мені слід задзвонити. Я використовую phpMyAdmin для налаштування та управління своїми базами даних більшу частину часу. У ньому ви можете просто поставити галочки поруч із потрібними рядками, а внизу натиснути «Експорт» та обрати SQL. Це дасть вам повідомлення про ВСТАНОВЛЕННЯ для тих записів, які ви вибрали. Сподіваюся, це допомагає.


-1

На основі ваших коментарів ваша мета - перенести зміни бази даних із середовища розробки в виробниче середовище.

Найкращий спосіб зробити це - зберегти зміни вашої бази даних у вихідному коді і, отже, відстежувати їх у вашій системі управління джерелами, такі як git або svn.

ви можете швидко встати та працювати з таким чимось подібним чином: https://github.com/davejkiger/mysql-php-migraitions

як дуже базове спеціальне рішення в 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.