2010-10-20 20 views
77

Sử dụng MySQL tôi có thể chạy các truy vấn:Nhận Bản Tuyên Bố Insert cho hàng hiện có trong MySQL

SHOW CREATE TABLE MyTable; 

Và nó sẽ trở lại với tuyên bố tạo bảng cho bảng specificed. Điều này rất hữu ích nếu bạn có một bảng đã được tạo và muốn tạo cùng một bảng trên một cơ sở dữ liệu khác.

Có thể lấy câu lệnh chèn cho hàng đã tồn tại hay tập hợp các hàng không? Một số bảng có nhiều cột và sẽ tốt hơn nếu tôi có thể nhận lệnh chèn để chuyển hàng sang cơ sở dữ liệu khác mà không cần phải viết 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à cái gì đó sẽ làm việc như sau:

SHOW INSERT Select * FROM MyTable WHERE ID = 10; 

Và đã sau đây được trả về cho tôi:

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

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. –

+1

@kibbee, Bạn đã tìm thấy giải pháp nào cho vấn đề này chưa ?? – Hasina

+2

Sẽ yêu một câu trả lời cho thấy các câu lệnh INSERT từ dấu nhắc 'mysql>'. Không có gì cho đến nay. –

Trả lời

9

Vì bạn sao chép bảng với SQL sản xuất by HIỂN THỊ TABLE MyTable, bạn chỉ có thể làm như 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, sau đó là cách duy nhất mà tôi biết là sử dụng mysqldumphttp://dev.mysql.com/doc/refman/5.1/en/mysqldump.htm. 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.

+0

Cơ sở dữ liệu trong câu hỏi tồn tại trên các máy khác nhau, trên các mạng khác nhau, vì vậy phương pháp này sẽ không hoạt động cho tôi, nhưng hoạt động tốt cho cơ sở dữ liệu chạy trên cùng một cá thể của MySQL – Kibbee

+0

Bạn đang cố di chuyển các tập dữ liệu giữa các máy? Bạn không thể nô lệ máy thứ hai để nhân bản dữ liệu, sau đó di chuyển tập con của bạn giữa các cơ sở dữ liệu trên nô lệ? –

+0

Hãy, vì lợi ích của đối số nói rằng tôi có một bảng có chứa các múi giờ. Bây giờ, vì một lý do nào đó một múi giờ mới được tạo ra (có lẽ với một bù đắp 15 phút hoặc một cái gì đó như thế). Vì vậy, tôi thêm hàng mới vào cơ sở dữ liệu phát triển 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 di chuyển thông tin múi giờ đó đến 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èn thêm, và sau đó đưa nó vào các tập lệnh để mang lại múi giờ mới. – Kibbee

5

Tôi sử dụng chương trình SQLYOG nơi tôi có thể thực hiện truy vấn chọn, trỏ tại screenshot kết quả và chọn xuất dưới dạng sql. Điều này mang lại cho tôi các câu lệnh chèn.

+0

Chỉ để tránh nhầm lẫn, nó nói định dạng sql nhưng nó thực sự xuất khẩu trong định dạng mysql. –

-1

Dựa trên nhận xét 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 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 một cách nhanh chóng với một cái gì đó như thế này: https://github.com/davejkiger/mysql-php-migrations

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 chức năng 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 một kịch bản di chuyển sẽ cập nhật bất kỳ môi trường nào cho thông số kỹ thuật của bạn.

10

Tôi đã viết một hàm php sẽ thực hiện việc này. Tôi cần thiết để thực hiện một tuyên bố trong trường hợp chèn một kỷ lục cần phải được thay thế sau khi xóa một 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; 
} 
+0

đã tiết kiệm cho tôi rất nhiều thời gian - đây chính xác là những gì tôi đến đây để tìm kiếm :) –

+1

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 nên sử dụng ít nhất 'mysql_real_escape_string' nếu đi tuyến này. – Eric

0

Tôi nghĩ rằng câu trả lời được cung cấp bởi máy tính xách tay Thang máy là tốt nhất ... nhưng vì không ai gợi ý cách tiếp cận mà Tôi sử dụng, tôi figured tôi nên kêu vang in Tôi sử dụng phpMyAdmin để thiết lập và quản lý cơ sở dữ liệu của tôi 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 bấm vào "Xuất khẩu" 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.

9

Mã của Trình nâng cấp máy tính xách tay hoạt động tốt, nhưng có một vài điều tôi đã tìm 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_string trong trường hợp bất cứ ai đã từng cố gắng để làm sql tiêm và để tránh vỡ đơn giản liên quan đến dấu ngoặc kép. Sử dụng cú pháp INSERT table (field...) VALUES (value...)... để các trường được xác định chỉ một lần và sau đó chỉ cần 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, tôi đã thêm NULL xử lý.

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

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

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

+0

@NigelJohnson 'INTO' là hoàn toàn [tùy chọn] (http://dev.mysql.com/doc/refman/5.5/en/insert.html). Tôi đã thêm xử lý null cho nó. –

101

Có vẻ như không phải là một cách để có được những INSERT báo cáo từ MySQL console, nhưng bạn có thể nhận được chúng sử dụng mysqldump như Rob đề nghị. Chỉ định -t để bỏ qua việc tạo bảng.

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

Xem phần 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) https://gist.github.com/arun057/5556563 –

+2

Và bạn có thể thêm "- chèn đầy đủ "nếu bạn muốn tên trường/cột có câu lệnh chèn – MeatPopsicle

+1

- giao dịch đơn lẻ – FelikZ

3

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

+0

Mẹo NIce. Đã thêm một ảnh chụp màn hình ;-) – ow3n

5

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

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

  2. Trong tab lựa chọn đối tượng, hãy 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 lược đồ.

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

  5. Nhấp vào Hoàn tất.

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

0

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 SP bằng 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; 
28

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

Snapshot of export button

  1. nhấp chuột vào đĩa mềm gần Export/Import phía trên kết quả
  2. cung cấp cho các tập tin mục tiêu một tên
  3. ở dưới cùng của cửa sổ, cho Format chọn SQL INSERT statements
  4. nhấp Save
  5. Bấm Export
1

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ử mã sau đây.

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ố insers:

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ố bản ghi trong your_table

+4

Có thể bạn có thể cung cấp thêm một chút cho câu trả lời của mình chứ không chỉ là một khối mã được dán? –

Các vấn đề liên quan