MySQL의 기존 행에 대한 삽입 문 가져오기
MySQL을 사용하여 쿼리를 실행할 수 있습니다.
SHOW CREATE TABLE MyTable;
지정된 테이블에 대한 create table 문이 반환됩니다.이 기능은 이미 작성된 테이블을 다른 데이터베이스에 작성하려는 경우에 유용합니다.
기존 행 또는 행 집합에 대한 삽입 문을 가져올 수 있습니까?일부 테이블에는 열이 많이 있기 때문에 insert 문을 쓰지 않아도 되고, CSV로 데이터를 내보낸 후 동일한 데이터를 다른 데이터베이스로 Import하지 않아도 다른 데이터베이스로 행을 다른 데이터베이스로 전송할 수 있는 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');
다른 방법이 없는 것 같아요INSERT
명령문을 MySQL 콘솔에서 가져오지만 Rob이 제안한 대로 mysqldump를 사용하여 가져올 수 있습니다.명시하다-t
테이블 작성을 생략합니다.
mysqldump -t -u MyUserName -pMyPassword MyDatabase MyTable --where="ID = 10"
에서는 단일 를 MySQL Workbench 수 .INSERT
just쿼리를 실행하고 다음 작업을 수행합니다.
-
Export/Import
- 대상 파일에 이름을 붙이다
- 창문의 아래쪽에 있는
Format
선택하다SQL INSERT statements
- 를 클릭합니다.
Save
- 를 클릭합니다.
Export
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을 사용하는 방법밖에 없습니다.특정 테이블의 데이터만 덤프하고 행을 제한하는 옵션을 제공할 수 있습니다.
이것을 실행하는 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;
}
Laptop Lift의 코드는 정상적으로 동작하지만, 사람들이 좋아할 만한 것이 몇 가지 있습니다.
데이터베이스 핸들러는 하드코드가 아닌 인수입니다."mysql api" 입니다.$id를 옵션의 $where 인수로 대체하여 유연성을 확보합니다.SQL 주입을 시도하고 따옴표를 포함하는 단순한 중단을 방지하기 위해 real_escape_string을 사용합니다.「」를.INSERT table (field...) VALUES (value...)...
구문을 사용하면 필드가 한 번만 정의되고 각 행의 값이 나열됩니다(이러한 값은 굉장합니다).해 주었기 때문에, 는 이이젤 because because, 는는 because because because because because because because because because because because because because because because because because because because because because because because because because because because because because because because 라고 덧붙였다.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).";";
}
?>
PHPMyAdmin에서는 다음 작업을 수행할 수 있습니다.
- 삽입문을 알고 싶은 행을 [복사]를 클릭합니다.SQL:
- SQL 미리 보기를 클릭합니다.
- 작성한 insert 스테이트먼트가 생성됩니다.
여러 행을 선택하고 테이블 하단에서 [복사]를 클릭한 후 SQL 미리보기를 클릭하면 한 번에 여러 행에 적용할 수 있습니다.
SQLYOG 프로그램을 사용하여 선택 쿼리를 만들고,를 입력하고sql.sql로 합니다.이렇게 하면 삽입문이 나타납니다.
다음 명령어는 INSERT를 둘러싸고 출력되는 추가 정보 없이 단말기에 덤프됩니다.이것에 의해, 파일에 쓰지 않고 단말로부터 카피할 수 있습니다.이 기능은 환경에서 새 파일 쓰기가 제한되는 경우에 유용합니다.
mysqldump -u MyUserName -pMyPassword MyDatabase MyTable --where="ID = 10" --compact --no-create-info --complete-insert --quick
「」를 사용합니다.mysqldump --help
하다
-q, --quick
쿼리를 버퍼링하지 않고 stdout으로 직접 덤프합니다(기본값은 on, 사용하지 않으려면 --skip-quick을 사용합니다).
-t, --no-create-info
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
-c, --complete-insert
인서트
--compact
보다 자세한 출력을 제공합니다(디버깅에 유용).구조 코멘트 및 헤더/바닥 구조를 디세블로 합니다.--syslog-add-drop-table --syslog-add-drop-table --syslog-disable-keys --syslog-set-chars.
MySQL 작업대 내에서 다음 절차를 수행합니다.
[ Server ]> [ Data Export ]을 클릭합니다.
Object Selection 탭에서 원하는 스키마를 선택합니다.
그런 다음 스키마 오른쪽에 있는 목록 상자를 사용하여 원하는 테이블을 선택합니다.
스크립트를 내보낼 파일 위치를 선택합니다.
[ Finish ]을 클릭합니다.
새로 작성한 파일로 이동하여 insert 문을 복사합니다.
테이블에 대해 "insert statement"를 가져오려면 다음 코드를 사용해 보십시오.
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`;
그 결과, insers 스테이트먼트가 됩니다.
★★★에 삽입your_table
)field_1
,field_2
,...
,field_n
( VALUES (value_11, value_12, ..., value_1n);
★★★에 삽입your_table
)field_1
,field_2
,...
,field_n
( VALUES (value_21, value_22, ..., value_2n);
/...................................................../
★★★에 삽입your_table
)field_1
,field_2
,...
,field_n
( VALUES (value_m1, value_m2, ..., value_mn);
여기서 m - your_table 내의 레코드 수
Sequel pro를 사용하여 이 작업을 수행할 수 있습니다. 얻어진 결과에 대해 'insert 스테이트먼트로 가져오기' 옵션이 있습니다.
Copy & Paste(Clipboard)만으로 SQL을 내보낼 필요 없이 편집하기 위한 INSERT 문을 작성하는 매우 쉽고 유용한 솔루션이 있습니다.
- MySQL Workbench의 쿼리 결과 창에서 행을 선택합니다(아마도 여러 행).행에 스크립트에 삽입하고 싶은 데이터와 다른 데이터가 포함되어 있는 경우나 플레이스 홀더를 사용하여 준비된 스테이트먼트를 작성하는 것이 목표인 경우에도 사용합니다.
- 클립보드에 있는 복사된 행을 동일한 테이블에 붙여넣습니다(쿼리 결과 목록은 워크벤치의 에디터임).
- Apply(적용)를 누르면 INSERT 문 - Do Not EXECUTE(실행하지 않음)을 표시하는 창이 열립니다.
- 창에서 클립보드로 SQL 복사
- 실행을 취소하여 데이터베이스를 변경하지 않고 SQL을 클립보드에 저장합니다.
- 원하는 위치에 SQL을 붙여넣고 원하는 대로 편집할 수 있습니다(예: ? 플레이스 홀더 삽입).
다음 코드를 사용하여 SP를 만들 수 있습니다.SP는 늘스도 지원합니다.
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;
HeidiSQL 사용자의 경우:
HeidiSQL을 사용하는 경우 삽입문을 얻을 행을 선택할 수 있습니다.그런 다음 오른쪽 클릭> [ Export grid rows ]> [ Copy to clipboard ]를 선택하여 "Output target"으로 "SQL INSERTs"를 선택하여 다른 행을 내보내지 않도록 합니다.[ Output format ]> [ OK ]을 클릭합니다.
삽입문은 클립보드 안에 있습니다.
phpMyAdmin(버전 5.x에서 테스트 완료)을 사용하는 경우:
삽입문을 작성할 행 옆에 있는 "Edit" 버튼을 클릭한 다음 작업 버튼 아래쪽에 있는 "Show insert query"를 선택하고 "Go"를 누릅니다.
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;
저는 노트북 리프트가 제공하는 답변이 가장 좋다고 생각합니다.하지만 아무도 내가 사용하는 방식을 제안하지 않았기 때문에 나도 동참해야겠다고 생각했다.대부분의 경우 phpMyAdmin을 사용하여 데이터베이스를 설정하고 관리합니다.여기서 원하는 행 옆에 체크 마크를 붙이고 맨 아래에서 "내보내기"를 클릭한 후 SQL을 선택하면 됩니다.선택한 레코드에 대한 INSERT 문장이 표시됩니다.이게 도움이 됐으면 좋겠다.
이거 드셔보세요
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;
}
사용하려면 다음 연락처로 전화하십시오.
$pdo = new PDO( "connection string goes here" );
$sql = get_insert_query($pdo, 'texts', "text_id = 959");
echo $sql;
PhpMyAdmin에서 현재 레지스터에 대한 get insert 문을 업데이트합니다.
- DB에서 레지스터를 가져올 테이블을 선택하십시오.
- 아래 그림과 같이 상단 메뉴 "내보내기" 탭
커스텀 내보내기
"데이터 생성 옵션"으로 이동합니다.
원하는 구문으로 "삽입" 기능을 선택합니다.
아주 간단합니다.Insert 문을 정적 블록에 작성하여 블록 전체를 스크립트로 실행하면 됩니다.
예: 선택한 행의 Insert 문을 테이블에서 가져오려면(예: Engineer_DETAILES) 이 블록을 실행해야 합니다.
spool
set sqlformat insert
select * from ENGINEER_DETAILS where engineer_name like '%John%';
spool off;
이 블록의 출력은 Insert 문이 됩니다.
의견을 바탕으로 데이터베이스 변경 사항을 개발 환경에서 실제 환경으로 마이그레이션하는 것이 목표입니다.
이를 위한 최선의 방법은 데이터베이스 변경을 소스 코드에 보관하고 결과적으로 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));
}
}
그런 다음 모든 환경을 사용자 사양에 맞게 업데이트하는 마이그레이션 스크립트를 생성할 수 있습니다.
언급URL : https://stackoverflow.com/questions/3978326/get-insert-statement-for-existing-row-in-mysql
'programing' 카테고리의 다른 글
matplotlib 범례 마커 한 번만 (0) | 2022.11.07 |
---|---|
C#의 문자열에서 함수를 호출한다. (0) | 2022.11.07 |
Big Decimal - new 또는 value Of를 사용합니다. (0) | 2022.11.07 |
Mariadb Docker 컨테이너가 데이터베이스 스키마를 사용한 초기화를 거부함 (0) | 2022.11.07 |
PHP: memory_limits > 1024M 설정이 작동하지 않음 (0) | 2022.11.07 |