MySQL의 기존 행에 대한 Insert Statement 가져 오기


139

MySQL을 사용하여 쿼리를 실행할 수 있습니다.

SHOW CREATE TABLE MyTable;

그리고 특정 테이블에 대한 테이블 작성 명령문을 리턴합니다. 테이블이 이미 작성되어 있고 다른 데이터베이스에서 동일한 테이블을 작성하려는 경우 유용합니다.

이미 존재하는 행 또는 행 집합에 대해 insert 문을 가져올 수 있습니까? 일부 테이블에는 많은 열이 있으므로 insert 문을 쓰거나 데이터를 CSV로 내 보낸 다음 동일한 데이터를 가져 오지 않고 다른 데이터베이스로 행을 전송하기 위해 insert 문을 가져올 수 있으면 좋을 것입니다. 다른 데이터베이스로.

명확히하기 위해, 내가 원하는 것은 다음과 같이 작동하는 것입니다.

SHOW INSERT Select * FROM MyTable WHERE ID = 10;

그리고 나를 위해 다음을 반환하십시오.

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

DB에 연결하기 위해 어떤 도구를 사용합니까? 일부 프로그램은 이러한 템플릿을 제공합니다.
GôTô

2
@ kibbee, 이것에 대한 해결책을 찾았습니까?
Hasina

2
mysql>프롬프트 에서 INSERT 문을 보여주는 답변을 좋아 합니다. 지금까지는 없습니다.
밥 스타 인

프로그래밍 방식으로 insert 문을 얻기 위해 이것에 대한 해결책을 찾았습니까?
Vaibhav Jain

답변:


155

INSERTMySQL 콘솔에서 문장 을 얻는 방법은 없지만 Rob이 제안한 것처럼 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
insert 문으로 필드 / 열 이름을 원하면 "--complete-insert"를 추가 할 수 있습니다
MeatPopsicle

3
-단일 거래
FelikZ

--hex-blob(예 : A의 BLOB 열이있는 경우 bit(1))이 될 수있는, 그렇지 않으면 문자열로 작성합니다 Unknown command '\0'삽입을 실행할 때 오류가 발생했습니다.
moffeltje

79

MySQL Workbench에서는 단일 테이블 쿼리의 결과를 INSERT명령문 목록으로 내보낼 수 있습니다 . 쿼리를 실행 한 후 다음을 수행하십시오.

내보내기 버튼의 스냅 샷

  1. Export/Import결과 위 의 플로피 디스크를 클릭하십시오
  2. 대상 파일에 이름을 지정하십시오
  3. 창 하단에서 Format선택SQL INSERT statements
  4. 딸깍 하는 소리 Save
  5. 딸깍 하는 소리 Export

2
또한 오른쪽의 아이콘은 방금 만든 내보내기를 가져 오는 데 매우 편리합니다. 아주 좋은 기능입니다. 까다로운 부분은 선택한 후에 결과 집합 패널에서만 아이콘에 액세스 할 수 있다는 것입니다.
Half_Duplex

13

SHOW CREATE TABLE MyTable 에서 생성 한 SQL로 테이블을 복사 했으므로 다음을 수행하여 데이터를 새 테이블에로드 할 수 있습니다.

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

INSERT 문을 정말로 원한다면 내가 아는 유일한 방법은 mysqldump http://dev.mysql.com/doc/refman/5.1/en/mysqldump.htm 을 사용하는 것 입니다. 특정 테이블의 데이터를 덤프하고 행을 제한하는 옵션을 제공 할 수 있습니다.


문제의 데이터베이스는 물리적으로 다른 컴퓨터, 다른 네트워크에 존재하므로이 방법은 저에게는 효과적이지 않지만 동일한 MySQL 인스턴스에서 실행되는 데이터베이스에는 적합합니다
Kibbee

컴퓨터간에 프로그래밍 방식으로 데이터 하위 집합을 이동하려고합니까? 데이터를 미러링하기 위해 두 번째 머신을 슬레이브로 만든 다음 슬레이브의 데이터베이스간에 서브 세트를 이동할 수 없습니까?
Rob Prouse

1
논쟁을 위해 시간대가 포함 된 테이블이 있다고 가정 해 봅시다. 이제 어떤 이유로 든 새로운 시간대가 생성됩니다 (아마 15 분 오프셋 또는 이와 유사한 것). 새 시간대에 대한 모든 정보가 포함 된 개발 데이터베이스에 새 행을 추가하고 필요한 모든 테스트를 수행합니다. 해당 시간대 정보를 프로덕션 데이터베이스로 이동해야 할 때 처음부터 삽입 문을 작성하거나 내보내기 / 가져 오기를 수행해야합니다. 삽입물을 가져온 다음 스크립트에 포함시켜 새 시간대를 활성화하는 것이 좋을 것입니다.
Kibbee

1
GUI 도구를 사용하여 삽입했거나 삽입 한 원래 값에서 3 번 변경해야했기 때문에 원본 삽입이 없습니다.
Kibbee

1
같은 컴퓨터의 데이터베이스에 대한 간단한 솔루션이 필요했고 Google이 나를 여기로 데려 왔습니다. 따라서 원래 답변과 관련이없는 경우에도이 답변에 감사드립니다. :)
Jason McCarrell

10

나는 이것을 할 PHP 함수를 작성했다. 히스토리 테이블을 삭제 한 후 레코드를 교체해야 할 경우를 대비하여 insert 문을 작성해야했습니다.

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
이 솔루션은 매우 약합니다. 예를 들어, 레코드 중 하나에 name이 포함되어 있으면 O' Malley생성 된 쿼리에 작은 따옴표가 일치하지 않아 구문 오류가 발생합니다. mysql_real_escape_string이 경로로 갈 때는 최소한 사용해야 합니다.
Eric Seastrand 21

아직도 좋은 물건, 확실히 그것을 사용할 것입니다
user7082181

9

Laptop Lift의 코드는 정상적으로 작동하지만 사람들이 좋아할만한 몇 가지 사항이 있습니다.

데이터베이스 핸들러는 하드 코딩되지 않은 인수입니다. 새로운 mysql API를 사용했습니다. 유연성을 위해 $ id를 선택적 $ where 인수로 대체했습니다. 누군가가 SQL 주입을 시도하고 따옴표와 관련된 간단한 파손을 피하려고 시도한 경우 real_escape_string을 사용했습니다. INSERT table (field...) VALUES (value...)...필드를 한 번만 정의한 다음 각 행의 값을 나열하기 위해 구문을 사용했습니다 (임플란트는 훌륭합니다). Nigel Johnson이 지적 했으므로 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).";";
}
?>

대한 누락 확실하지 INTOINSERT INTO {$tables}있지만 테이블에 널 (null)의 아무 처리도 없다.
Nigel Johnson

1
@NigelJohnson INTO은 완전히 선택 사항 입니다. null 처리를 추가했습니다.
Chinoto Vokro

6

선택 쿼리를 만들고 결과를 가리키고 sql로 내보내기를 선택할 수있는 SQLYOG 프로그램을 사용합니다 스크린 샷. 이것은 삽입 문을 제공합니다.


혼란을 피하기 위해 sql 형식이라고하지만 실제로는 mysql 형식으로 내보내집니다.
Kumar Vikramjeet

고마워 .... +1 그것은 나를 위해 일했다. 그러나 선택한 행만 얻을 수 없었습니다. :( 테이블의 모든 행에 대해 삽입 쿼리를 제공하는 메소드
Mukit09

5

MySQL 작업대 내에서 다음을 수행하십시오.

  1. 서버> 데이터 내보내기를 클릭하십시오.

  2. 오브젝트 선택 탭에서 원하는 스키마를 선택하십시오.

  3. 그런 다음 스키마 오른쪽의 목록 상자를 사용하여 원하는 테이블을 선택하십시오.

  4. 스크립트를 내보낼 파일 위치를 선택하십시오.

  5. Finish를 클릭하십시오.

  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-your_table의 레코드 수


4
붙여 넣은 코드 블록보다 답변에 약간 더 많은 것을 제공 할 수 있습니까?
매트 플레처

예, 그러나 이것은 하드 코딩되어 있으며 field_ *는 정적 이름입니다. 그것은 작업의 절반을 만들어 내고, 그렇게 잘하지 않습니다
Daniele Cruciani

왜 GROUP_CONCAT입니까?
sealabr

3

Sequel pro를 사용 하여이 작업을 수행 할 수 있으며 얻은 결과에 대해 'insert as insert statement'옵션이 있습니다.


3

PHPMyAdmin에서 다음을 수행 할 수 있습니다.

  1. 삽입 문 SQL을 알고 자하는 행에서 복사를 클릭하십시오.

사본 선택

  1. SQL 미리보기를 클릭하십시오.

미리보기를 선택하십시오.

  1. 생성 된 insert 문을 생성합니다.

행을 선택하고 테이블 하단에서 복사를 클릭 한 다음 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를 만들 수 있습니다. NULL도 지원합니다.

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을 사용하는 경우 insert 문을 가져올 행을 선택할 수 있습니다. 그런 다음 마우스 오른쪽 버튼으로 클릭> 그리드 행 내보내기를 클릭하고 "출력 대상"에서 "클립 보드로 복사"를 선택하고 "행 선택"에서 "선택"을 선택하여 "출력 형식"에 대해 "SQL INSERTs"를 내 보내지 말고 확인을 클릭하십시오.

여기에 이미지 설명을 입력하십시오

삽입 문은 클립 보드 안에 있습니다.


0

필자는 랩탑 리프트가 제공하는 답변이 최고라고 생각하지만 아무도 내가 사용하는 접근 방식을 제안하지 않았으므로 차임해야한다고 생각했습니다. phpMyAdmin을 사용하여 대부분의 시간에 데이터베이스를 설정하고 관리합니다. 여기에서 원하는 행 옆에 확인 표시를하고 맨 아래에서 "내보내기"를 클릭하고 SQL을 선택하면됩니다. 선택한 레코드에 대한 INSERT 문을 제공합니다. 도움이 되었기를 바랍니다.


-1

의견을 바탕으로 목표는 데이터베이스 변경 사항을 개발 환경에서 프로덕션 환경으로 마이그레이션하는 것입니다.

이를 수행하는 가장 좋은 방법은 소스 코드에서 데이터베이스 변경 사항을 유지하고 결과적으로 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));
    }
}

그런 다음 환경을 사양에 맞게 업데이트하는 마이그레이션 스크립트를 만들 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.