Nhận câu lệnh chèn cho hàng hiện có trong MySQL


139

Sử dụng MySQL Tôi có thể chạy truy vấn:

SHOW CREATE TABLE MyTable;

Và nó sẽ trả về câu lệnh tạo bảng cho bảng cụ thể. Điều này hữu ích nếu bạn đã tạo một bảng và muốn tạo cùng một bảng trên cơ sở dữ liệu khác.

Có thể lấy câu lệnh chèn cho một hàng đã có sẵn hoặc tập hợp các hàng không? Một số bảng có nhiều cột và thật tuyệt khi tôi có thể nhận được một câu lệnh chèn để chuyển các hàng sang cơ sở dữ liệu khác mà không phải viết ra câu lệnh chèn hoặc không xuất dữ liệu sang CSV và sau đó nhập cùng một dữ liệu vào cơ sở dữ liệu khác.

Chỉ cần làm rõ, những gì tôi muốn là một cái gì đó sẽ hoạt động như sau:

SHOW INSERT Select * FROM MyTable WHERE ID = 10;

Và có những điều sau đây trả lại cho tôi:

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

Bạn sử dụng công cụ nào để kết nối với DB? Một số chương trình cung cấp các mẫu như vậy.
GôTô

2
@kibbee, bạn đã tìm được giải pháp nào cho việc này chưa ??
Hasina

2
Rất thích một câu trả lời cho thấy các câu lệnh INSERT từ mysql>dấu nhắc. Không có gì cho đến nay làm.
Bob Stein

Bạn đã tìm thấy giải pháp nào cho việc này chưa, để có được câu lệnh chèn theo chương trình?
Vaibhav Jain

Câu trả lời:


155

Dường như không có cách nào để lấy các INSERTcâu lệnh từ bảng điều khiển MySQL, nhưng bạn có thể lấy chúng bằng cách sử dụng mysqldump như Rob đề xuất. Chỉ định -tbỏ qua việc tạo bảng.

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

Xem điều này nếu bạn gặp lỗi mysqldump: Không thể thực thi 'SELECT @@ GTID_MODE': Biến hệ thống không xác định 'GTID_MODE' (1193) gist.github.com/arun057/5556563
Daniel Schaffer

10
Và bạn có thể thêm "--complete-insert" nếu bạn muốn tên trường / cột bằng câu lệnh chèn
MeatPopsicle

3
- giao dịch
đơn lẻ

--hex-blobnếu bạn có các cột blob (ví dụ a bit(1)), nó sẽ ghi nó dưới dạng chuỗi, điều này có thể dẫn đến Unknown command '\0'lỗi khi thực hiện INSERT.
moffeltje

79

Trong MySQL Workbench, bạn có thể xuất kết quả của bất kỳ truy vấn bảng đơn nào dưới dạng danh sách các INSERTcâu lệnh. Chỉ cần chạy truy vấn, và sau đó:

Ảnh chụp nút xuất

  1. nhấp vào đĩa mềm gần Export/Importphía trên kết quả
  2. đặt tên cho tệp đích
  3. ở dưới cùng của cửa sổ, để FormatchọnSQL INSERT statements
  4. nhấp chuột Save
  5. nhấp chuột Export

2
Ngoài ra, biểu tượng bên phải rất tiện dụng để nhập xuất mà bạn vừa tạo. Tính năng rất hay. Phần khó khăn duy nhất là bạn chỉ có thể truy cập các biểu tượng từ bảng điều khiển kết quả sau khi chọn.
Half_Duplex

13

Vì bạn đã sao chép bảng với SQL được tạo bởi SHOW CREATE TABLE MyTable , bạn chỉ có thể thực hiện các thao tác sau để tải dữ liệu vào bảng mới.

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

Nếu bạn thực sự muốn các câu lệnh INSERT, thì cách duy nhất mà tôi biết là sử dụng mysqldump http://dev.mysql.com/doc/refman/5.1/en/mysqldump.htmlm . Bạn có thể cung cấp cho nó các tùy chọn để chỉ đổ dữ liệu cho một bảng cụ thể và thậm chí giới hạn các hàng.


Các cơ sở dữ liệu được đề cập tồn tại trên các máy vật lý khác nhau, trên các mạng khác nhau, vì vậy phương pháp này sẽ không hiệu quả với tôi, nhưng hoạt động tốt đối với các cơ sở dữ liệu chạy trên cùng một phiên bản của MySQL
Kibbee

Bạn đang cố gắng lập trình di chuyển các tập hợp con dữ liệu giữa các máy? Bạn không thể nô lệ máy thứ hai để phản chiếu dữ liệu, sau đó di chuyển các tập hợp con của bạn giữa các cơ sở dữ liệu trên nô lệ?
Rob Prouse

1
Chúng ta hãy tranh luận rằng tôi có một bảng chứa các múi giờ. Bây giờ, vì một số lý do, một múi giờ mới được tạo ra (có thể với thời gian bù 15 phút hoặc đại loại như thế). Vì vậy, tôi thêm hàng mới vào cơ sở dữ liệu phát triển có chứa tất cả thông tin về múi giờ mới và thực hiện tất cả các thử nghiệm cần thiết. Khi đến lúc chuyển thông tin múi giờ đó sang cơ sở dữ liệu sản xuất, tôi phải tạo một câu lệnh chèn từ đầu hoặc thực hiện xuất / nhập. Sẽ thật tuyệt khi có thể chỉ cần chèn, và sau đó đưa nó vào các tập lệnh để mang múi giờ mới trực tiếp.
Kibbee

1
Tôi không có phần chèn ban đầu vì tôi có thể đã chèn nó bằng công cụ GUI hoặc tôi có thể phải thay đổi nó 3 lần so với giá trị ban đầu tôi đã chèn.
Kibbee

1
Tôi tình cờ cần một giải pháp đơn giản cho cơ sở dữ liệu trên cùng một máy và google đã đưa tôi đến đây. Vì vậy, tôi rất biết ơn về câu trả lời này, ngay cả khi nó nằm ngoài ngữ cảnh của câu hỏi ban đầu :)
Jason McCarrell

10

Tôi đã viết một hàm php sẽ làm điều này. Tôi cần tạo một câu lệnh chèn trong trường hợp cần thay thế một bản ghi sau khi xóa bảng lịch sử:

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
Giải pháp này khá dễ vỡ. Ví dụ: nếu một trong các bản ghi của bạn chứa tên O' Malley, các truy vấn được tạo sẽ có lỗi cú pháp do dấu ngoặc đơn không khớp. Bạn ít nhất nên sử dụng mysql_real_escape_stringnếu đi tuyến đường này.
Eric Seastrand

vẫn còn những thứ tốt đẹp, tôi chắc chắn sẽ sử dụng nó
user7082181

9

Mã của Laptop Lift hoạt động tốt, nhưng có một vài điều tôi cho rằng mọi người có thể thích.

Trình xử lý cơ sở dữ liệu là một đối số, không được mã hóa cứng. Đã sử dụng api mysql mới. Đã thay thế $ id bằng một đối số $ where tùy chọn để linh hoạt. Được sử dụng real_escape_opes trong trường hợp bất kỳ ai đã từng thử tiêm sql và để tránh các ngắt đơn giản liên quan đến dấu ngoặc kép. Đã sử dụng INSERT table (field...) VALUES (value...)...cú pháp sao cho các trường chỉ được xác định một lần và sau đó chỉ liệt kê các giá trị của mỗi hàng (implode là tuyệt vời). Bởi vì Nigel Johnson đã chỉ ra nó, tôi đã thêmNULL xử lý.

Tôi đã sử dụng $array[$key]bởi vì tôi lo lắng nó có thể thay đổi bằng cách nào đó, nhưng trừ khi có gì đó không ổn, dù sao thì nó cũng không nên.

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

Không chắc chắn về việc thiếu INTOtrên INSERT INTO {$tables}nhưng không có xử lý null trong bảng.
Nigel Johnson

1
@NigelJohnson INTOlà hoàn toàn tùy chọn . Tôi đã thêm xử lý null vào nó.
Chinoto Vokro

6

Tôi sử dụng chương trình SQLYOG nơi tôi có thể thực hiện một truy vấn chọn, chỉ vào ảnh chụp màn hìnhkết quả và chọn xuất dưới dạng sql. Điều này cho tôi các báo cáo chèn.


Chỉ để tránh nhầm lẫn, nó nói định dạng sql nhưng nó thực sự xuất ở định dạng mysql.
Kumar Vikramjeet

Cảm ơn .... +1 vì nó đã làm việc cho tôi. Nhưng không thể chỉ nhận các hàng được chọn. :( Phương thức của bạn đưa ra truy vấn chèn cho tất cả các hàng của bảng.
Mukit09

5

Trong băng ghế làm việc của MySQL thực hiện như sau:

  1. Nhấp vào Máy chủ> Xuất dữ liệu

  2. Trong tab Chọn đối tượng, chọn lược đồ mong muốn.

  3. Tiếp theo, chọn các bảng mong muốn bằng cách sử dụng hộp danh sách ở bên phải của lược đồ.

  4. Chọn một vị trí tập tin để xuất tập lệnh.

  5. Nhấp vào Kết thúc.

  6. Điều hướng đến tệp vừa tạo và sao chép các câu lệnh chèn.


đây là xuất bảng đầy đủ, không xuất hàng cụ thể
Yehia

4

Nếu bạn muốn nhận "câu lệnh chèn" cho bảng của mình, bạn có thể thử đoạn mã sau.

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

Kết quả là, bạn sẽ có tuyên bố trong:

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

, trong đó m - số lượng bản ghi trong your_table


4
Có lẽ bạn có thể cung cấp nhiều hơn một chút cho câu trả lời của bạn chứ không chỉ là một khối mã được dán?
Matt Fletcher

vâng, nhưng đây là mã hóa cứng, trường_ * là tên tĩnh. Nó làm cho một nửa công việc, và nó làm cho nó không tốt lắm
Daniele Cruciani

Tại sao GROUP_CONCAT?
sealabr

3

bạn có thể sử dụng Sequel pro để làm điều này, có một tùy chọn để 'lấy làm câu lệnh chèn' cho kết quả thu được


3

Trong PHPMyAdmin bạn có thể:

  1. bấm vào sao chép trên hàng bạn muốn biết câu lệnh chèn SQL của nó:

Chọn bản sao

  1. bấm vào Xem trước SQL:

Chọn Xem trước

  1. bạn sẽ nhận được câu lệnh chèn được tạo để tạo ra nó

Bạn có thể áp dụng điều đó trên nhiều hàng cùng một lúc nếu bạn chọn chúng và nhấp vào sao chép từ cuối bảng và sau đó Xem trước SQl


Thêm nhiều giải thích và thông tin cho câu trả lời của bạn
Ramin eghbalian

1

Với PDO bạn có thể làm theo cách này.

$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

Bạn có thể tạo một SP với mã bên dưới - nó cũng hỗ trợ 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

Đối với người dùng HeidiSQL :

Nếu bạn sử dụng HeidiSQL, bạn có thể chọn (các) hàng bạn muốn nhận câu lệnh chèn. Sau đó nhấp chuột phải> Xuất hàng lưới> chọn "Sao chép vào bảng tạm" cho "Mục tiêu đầu ra", "Lựa chọn" cho "Lựa chọn hàng" để bạn không xuất các hàng khác, "SQL INSERT" cho "Định dạng đầu ra"> Nhấp OK.

nhập mô tả hình ảnh ở đây

Câu lệnh chèn sẽ nằm trong bảng tạm của bạn.


0

Tôi nghĩ rằng câu trả lời được cung cấp bởi Laptop Lifts là tốt nhất ... nhưng vì không ai đề xuất cách tiếp cận mà tôi sử dụng, nên tôi nghĩ rằng tôi nên kêu gọi. Tôi sử dụng phpMyAdmin để thiết lập và quản lý cơ sở dữ liệu của mình hầu hết thời gian. Trong đó, bạn có thể chỉ cần đặt dấu kiểm bên cạnh các hàng bạn muốn và ở dưới cùng nhấp vào "Xuất" và chọn SQL. Nó sẽ cung cấp cho bạn các câu lệnh INSERT cho bất kỳ bản ghi nào bạn đã chọn. Hi vọng điêu nay co ich.


-1

Dựa trên ý kiến ​​của bạn, mục tiêu của bạn là di chuyển các thay đổi cơ sở dữ liệu từ môi trường phát triển sang môi trường sản xuất.

Cách tốt nhất để làm điều này là giữ cho các thay đổi cơ sở dữ liệu của bạn trong mã nguồn của bạn và do đó theo dõi chúng trong hệ thống kiểm soát nguồn của bạn như git hoặc svn.

bạn có thể đứng dậy và chạy nhanh với thứ như thế này: https://github.com/davejkiger/mysql-php-migations

như một giải pháp tùy chỉnh rất cơ bản trong PHP, bạn có thể sử dụng một hàm như thế này:

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

sau đó bạn có thể tạo tập lệnh di chuyển sẽ cập nhật bất kỳ môi trường nào vào thông số kỹ thuật của bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.