Reputation: 66162
Using MySQL I can run the query:
SHOW CREATE TABLE MyTable;
And it will return the create table statement for the specificed table. This is useful if you have a table already created, and want to create the same table on another database.
Is it possible to get the insert statement for an already existing row, or set of rows? Some tables have many columns, and it would be nice for me to be able to get an insert statement to transfer rows over to another database without having to write out the insert statement, or without exporting the data to CSV and then importing the same data into the other database.
Just to clarify, what I want is something that would work as follows:
SHOW INSERT Select * FROM MyTable WHERE ID = 10;
And have the following returned for me:
INSERT INTO MyTable(ID,Col1,Col2,Col3) VALUES (10,'hello world','some value','2010-10-20');
Upvotes: 210
Views: 245504
Reputation: 11741
mysqlsh which is an upgraded version of mysql client, now has utility functions to dump mysql tables. With mysqlsh, we don't need mysqldump client. With mysql shell itself, we can dump data from mysql. This approach also doesn't need a heavy GUI client.
Install mysql shell, if you don't already have one.
Run mysqlsh
command
# syntax
util.dumpTables(schema, tables, outputUrl[, options])
# example
util.dumpTables("hr", [ "employees", "salaries" ], "local_dir")
We can pass filters to select the desired data like following :
util.dumpTables("sakila", ["actor","actor_info"], "out", {"where" :
{"sakila.actor": "actor_id > 150", "sakila.actor_info": "actor_id > 150"}})
Upvotes: 0
Reputation: 99
If you want get "insert statement" for your table you can try the following code.
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`;
As a result, you will have insers statement:
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);
, where m - number of records in your_table
Upvotes: 8
Reputation: 11
In SQL Server Management Studio we can use Generate Script
Upvotes: -2
Reputation: 432
In MySQL Workbench, right-click the table and select 'Send to SQL Editor'/'Insert Statement'. Clean it up a bit and you're good to go.
Upvotes: -1
Reputation: 15
Its very simple. All you have to do is write an Insert statement in a static block and run it as a script as a whole block.
E.g. If you want to get Insert statements from a table (say ENGINEER_DETAILS) for selected rows, then you have to run this block -
spool
set sqlformat insert
select * from ENGINEER_DETAILS where engineer_name like '%John%';
spool off;
The output of this block will be Insert statements.
Upvotes: -2
Reputation: 19
Update for get insert statement for current registers at PhpMyAdmin:
Custom export
Move down to "Data creation options"
Once there, select "Insert" function at your preferred syntax
Upvotes: -1
Reputation: 2793
You can try this
function get_insert_query($pdo, $table, $where_sth)
{
$sql = "";
$row_data = $pdo->query("SELECT * FROM `{$table}` WHERE $where_sth")->fetch();
if($row_data){
$sql = "INSERT INTO `$table` (";
foreach($row_data as $col_name => $value){
$sql .= "`".$col_name."`, ";
}
$sql = rtrim($sql, ", ");
$sql .= ") VALUES (";
foreach($row_data as $col_name => $value){
if (is_string($value)){
$value = $pdo->quote($value);
} else if ($value === null){
$value = 'NULL';
}
$sql .= $value .", ";
}
$sql = rtrim($sql, ", ");
$sql .= ");";
}
return $sql;
}
To use it, just call:
$pdo = new PDO( "connection string goes here" );
$sql = get_insert_query($pdo, 'texts', "text_id = 959");
echo $sql;
Upvotes: 0
Reputation: 489
In case you use phpMyAdmin (Tested on version 5.x):
Click on "Edit" button next to the row for which you would like to have an insert statement, then on the bottom next to the action buttons just select "Show insert query" and press "Go".
Upvotes: 2
Reputation: 1030
The below command will dump into the terminal without all the extra stuff mysqldump will output surrounding the INSERT. This allows copying from the terminal without it writing to a file. This is useful if the environment restricts writing new files.
mysqldump -u MyUserName -pMyPassword MyDatabase MyTable --where="ID = 10" --compact --no-create-info --complete-insert --quick
Using mysqldump --help
I found the following options.
-q, --quick
Don't buffer query, dump directly to stdout. (Defaults to on; use --skip-quick to disable.)
-t, --no-create-info
Don't write table creation info.
-c, --complete-insert
Use complete insert statements.
--compact
Give less verbose output (useful for debugging). Disables structure comments and header/footer constructs. Enables options --skip-add-drop-table --skip-add-locks --skip-comments --skip-disable-keys --skip-set-charset.
Upvotes: 13
Reputation: 258
There is a quite easy and useful solution for creating an INSERT Statement for editing without the need to export SQL with just Copy & Paste (Clipboard):
Upvotes: 6
Reputation: 111
In PHPMyAdmin you can:
You can apply that on many rows at once if you select them and click copy from the bottom of the table and then Preview SQl
Upvotes: 11
Reputation: 1202
For HeidiSQL users:
If you use HeidiSQL, you can select the row(s) you wish to get insert statement. Then right click > Export grid rows > select "Copy to clipboard" for "Output target", "Selection" for "Row Selection" so you don't export other rows, "SQL INSERTs" for "Output format" > Click OK.
The insert statement will be inside you clipboard.
Upvotes: 4
Reputation: 22196
In MySQL Workbench you can export the results of any single-table query as a list of INSERT
statements. Just run the query, and then:
Export/Import
above the resultsFormat
select SQL INSERT statements
Save
Export
Upvotes: 140
Reputation: 51
You can create a SP with the code below - it supports NULLS as well.
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;
Upvotes: 3
Reputation: 15735
There doesn't seem to be a way to get the INSERT
statements from the MySQL console, but you can get them using mysqldump like Rob suggested. Specify -t
to omit table creation.
mysqldump -t -u MyUserName -pMyPassword MyDatabase MyTable --where="ID = 10"
Upvotes: 212
Reputation: 4426
With PDO you can do it this way.
$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;
Upvotes: 1
Reputation: 94499
Within MySQL work bench perform the following:
Click Server > Data Export
In the Object Selection Tab select the desired schema.
Next, select the desired tables using the list box to the right of the schema.
Select a file location to export the script.
Click Finish.
Navigate to the newly created file and copy the insert statements.
Upvotes: 5
Reputation: 978
Laptop Lift's code works fine, but there were a few things I figured people may like.
Database handler is an argument, not hardcoded. Used the new mysql api. Replaced $id with an optional $where argument for flexibility. Used real_escape_string in case anyone has ever tried to do sql injection and to avoid simple breakages involving quotes. Used the INSERT table (field...) VALUES (value...)...
syntax so that the fields are defined only once and then just list off the values of each row (implode is awesome). Because Nigel Johnson pointed it out, I added NULL
handling.
I used $array[$key]
because I was worried it might somehow change, but unless something is horribly wrong, it shouldn't anyway.
<?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).";";
}
?>
Upvotes: 11
Reputation: 1229
you can use Sequel pro to do this, there is an option to 'get as insert statement' for the results obtained
Upvotes: 4
Reputation: 3704
I use the program SQLYOG where I can make a select query, point at the results and choose export as sql. This gives me the insert statements.
Upvotes: 7
Reputation: 6150
I think that the answer provided by Laptop Lifts is best...but since nobody suggested the approach that I use, i figured i should chime in. I use phpMyAdmin to set up and manage my databases most of the time. In it, you can simply put checkmarks next to the rows you want, and at the bottom click "Export" and chose SQL. It will give you INSERT statements for whichever records you selected. Hope this helps.
Upvotes: 0
Reputation: 661
I wrote a php function that will do this. I needed to make an insert statement in case a record needs to be replaced after deletion for a history table:
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;
}
Upvotes: 12
Reputation: 1501
Based on your comments, your goal is to migrate database changes from a development environment to a production environment.
The best way to do this is to keep your database changes in your source code and consequently track them in your source control system such as git or svn.
you can get up and running quickly with something like this: https://github.com/davejkiger/mysql-php-migrations
as a very basic custom solution in PHP, you can use a function like this:
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));
}
}
then you can create a migration script which will update any environment to your specifications.
Upvotes: -2
Reputation: 22657
Since you copied the table with the SQL produced by SHOW CREATE TABLE MyTable, you could just do the following to load the data into the new table.
INSERT INTO dest_db.dest_table SELECT * FROM source_db.source_table;
If you really want the INSERT statements, then the only way that I know of is to use mysqldump http://dev.mysql.com/doc/refman/5.1/en/mysqldump.htm. You can give it options to just dump data for a specific table and even limit rows.
Upvotes: 16