programing

행 복사하지만 새 ID 사용

firstcheck 2021. 1. 14. 08:33
반응형

행 복사하지만 새 ID 사용


자동 증가 id및 임의 수의 열 이있는 "테스트"테이블 이 있습니다.

id물론 이 테이블의 모든 열이 동일한 행의 복사본을 만들고 싶습니다.

모든 열의 이름을 지정하지 않고이를 수행하는 방법이 있습니까?

나는 INSERT... SELECT... ON DUPLICATE KEY그것이 결코 만들지 않는다는 것을 깨달을 때까지 나를 도울 것이라고 생각했다 INSERT ON DUPLICATE. 그것은 단지 기존 행을 업데이트한다.


테이블에 다음 필드가 있다고 가정 해 보겠습니다.

( pk_id int not null auto_increment primary key,
  col1 int,
  col2 varchar(10)
)

그런 다음 새 키 값을 사용하여 한 행에서 다른 행으로 값을 복사하려면 다음 쿼리가 도움이 될 수 있습니다.

insert into my_table( col1, col2 ) select col1, col2 from my_table where pk_id=?;

그러면 pk_id필드에 대한 새 값이 생성 되고 col1, 및 col2선택한 행의 값이 복사됩니다 .

이 샘플을 확장하여 테이블의 더 많은 필드에 적용 할 수 있습니다.

업데이트 :
JohnP와 Martin의 의견에 따라 -

임시 테이블을 사용하여 먼저 기본 테이블에서 버퍼링하고이를 사용하여 다시 기본 테이블에 복사 할 수 있습니다. 임시 테이블의 pk 참조 필드 만 업데이트해도 기본 테이블에 이미있을 수 있으므로 도움이되지 않습니다. 대신 임시 테이블에서 pk 필드를 삭제하고 다른 모든 필드를 기본 테이블에 복사 할 수 있습니다.

참조 게시물 에서 Tim Ruehsen 의 답변을 참조하면 :

CREATE TEMPORARY TABLE tmp SELECT * from my_table WHERE ...;
ALTER TABLE tmp drop pk_id; # drop autoincrement field
# UPDATE tmp SET ...; # just needed to change other unique keys
INSERT INTO my_table SELECT 0,tmp.* FROM tmp;
DROP TEMPORARY TABLE tmp;

도움이 되었기를 바랍니다.


이것은 MySQL 모든 버전 및 Amazon RDS Aurora에서 작동합니다.

INSERT INTO my_table SELECT 0,tmp.* FROM tmp;

또는

인덱스 열을 NULL로 설정 한 다음 INSERT를 수행합니다.

하지만 MariaDB가 아니라 버전 10을 테스트했습니다.


이것은 한 행만 복제하는 경우에만 작동합니다.

  • 테이블에서 하나의 행을 선택하십시오.
  • 모든 연관 가져 오기
  • ID 행 설정 해제 (고유 색인 키)
  • array [0] 키를 열 이름에 삽입합니다.
  • array [0] 값을 열 값에 삽입
  • 쿼리 실행

코드:

 $qrystr = "SELECT * FROM mytablename  WHERE id= " . $rowid;
 $qryresult = $this->connection->query($qrystr);
 $result = $qryresult->fetchAll(PDO::FETCH_ASSOC);
 unset($result[0]['id']); //Remove ID from array
 $qrystr = " INSERT INTO mytablename";
 $qrystr .= " ( " .implode(", ",array_keys($result[0])).") ";
 $qrystr .= " VALUES ('".implode("', '",array_values($result[0])). "')";
 $result = $this->connection->query($qrystr);
 return $result;

물론 PDO : bindparam을 사용하고 공격에 대해 변수를 확인해야하지만 예제를 제공합니다.

추가 정보

NULL처리에 문제가있는 경우 다음 코드를 사용하여 imploding값이 아닌 이름과 값만 사용할 수 있습니다 NULL.

foreach ($result[0] as $index => $value) {
    if ($value === null) unset($result[0][$index]);
}

열 수에 따라 열 이름을 지정하고 ID를 제외하고 수동으로 ID를 추가하거나 테이블에있는 경우 보조 ID (sid)를 추가 할 수 있습니다.

insert into PROG(date, level, Percent, sid) select date, level, Percent, 55 from PROG where sid = 31여기에서 sid 31에 둘 이상의 결과 행이있는 경우 모든 행이 sid 55로 복사되고 자동 ID는 계속 자동 생성됩니다. ID 전용 : insert into PROG(date, level, Percent, ID) select date, level, Percent, 55 from PROG where ID = 31 여기서 55는 테이블에서 다음으로 사용 가능한 ID이고 ID 31은 복사하려는 ID입니다.


INSERT into table_name (  
    `product_id`, 
    `other_products_url_id`, 
    `brand`, 
    `title`, 
    `price`, 
    `category`, 
    `sub_category`, 
    `quantity`, 
    `buy_now`, 
    `buy_now_url`, 
    `is_available`, 
    `description`, 
    `image_url`, 
    `image_type`, 
    `server_image_url`, 
    `reviews`, 
    `hits`, 
    `rating`, 
    `seller_name`, 
    `seller_desc`, 
    `created_on`, 
    `modified_on`, 
    `status`) 
SELECT 
    `product_id`, 
    `other_products_url_id`, 
    `brand`, 
    `title`, 
    `price`, 
    `category`, 
    `sub_category`, 
    `quantity`, 
    `buy_now`, 
    concat(`buy_now_url`,'','#test123456'), 
    `is_available`, 
    `description`, 
    `image_url`, 
    `image_type`, 
    `server_image_url`, 
    `reviews`, 
    `hits`, 
    `rating`, 
    `seller_name`, 
    `seller_desc`, 
    `created_on`, 
    `modified_on`, 
    `status` 
FROM `table_name` WHERE id='YourRowID';

ReferenceURL : https://stackoverflow.com/questions/11331573/copy-row-but-with-new-id

반응형