행 복사하지만 새 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
'programing' 카테고리의 다른 글
O (n)과 O (log (n))의 차이점-어느 것이 더 낫고 정확히 O (log (n))는 무엇입니까? (0) | 2021.01.14 |
---|---|
C # 스레드가 잠들지 않습니까? (0) | 2021.01.14 |
d3.js의 노드 중앙에 레이블 배치 (0) | 2021.01.14 |
ggplot2의 막대 그림에서 막대 사이의 공간을 늘리는 방법은 무엇입니까? (0) | 2021.01.14 |
Rails 및 Devise의 강력한 매개 변수 (0) | 2021.01.14 |