MySQL에서 하나의 행을 복사하여 동일한 테이블에 삽입 할 수 있습니까?


162
insert into table select * from table where primarykey=1

동일한 테이블에 삽입하기 위해 하나의 행을 복사하려고합니다 (예 : 테이블의 기존 행을 복제하려고 함). "select"뒤에 모든 열을 나열하지 않고도이 작업을 수행하려고합니다. 열이 너무 많습니다.

그러나이 작업을 수행하면 오류가 발생합니다.

키 1의 중복 된 항목 'xxx'

복사하려는 레코드의 임시 컨테이너와 동일한 열로 다른 테이블을 작성하여이를 처리 할 수 ​​있습니다.

create table oldtable_temp like oldtable;
insert into oldtable_temp select * from oldtable where key=1;
update oldtable_tem set key=2;
insert into oldtable select * from oldtable where key=2;

이것을 해결하는 더 간단한 방법이 있습니까?


키의 하드 코딩 된 값에 대한 의견이 있습니다. 나는 max(oldtable.id) + oldtable_temp.key이런 식으로 뭔가 ID를 증가시키고 고유한지 확인합니다.
guy mograbi


@OrganicAdvocate 이것은 그 질문보다 더 많은 답변과 더 많은 견해를 가지고 있습니다
Drew

답변:


189

Leonard Challis의 기술을 몇 가지 변경 사항으로 사용했습니다.

CREATE TEMPORARY TABLE tmptable_1 SELECT * FROM table WHERE primarykey = 1;
UPDATE tmptable_1 SET primarykey = NULL;
INSERT INTO table SELECT * FROM tmptable_1;
DROP TEMPORARY TABLE IF EXISTS tmptable_1;

임시 테이블로서 하나 이상의 레코드가 없어야하므로 기본 키에 대해 걱정할 필요가 없습니다. null로 설정하면 MySQL이 값 자체를 선택할 수 있으므로 복제본을 만들 위험이 없습니다.

확실하게 삽입하려면 하나의 행만 삽입하면 INSERT INTO 줄 끝에 LIMIT 1을 추가 할 수 있습니다.

또한 기본 키 값 (이 경우 1)을 임시 테이블 이름에 추가했습니다.


3
이 솔루션은 MySQL이 기본 키 값을 선택할 수 있다는 점에서 (투표를 한 다른 솔루션과 달리) 정확합니다.
Jan Hettich 2013

1
비록 정확히 같은 일 (일치하지 않는 임시 테이블 이름에 기인하지 않습니다 tmptable_1tmptable)
키어런 툴리

9
기본 키는 어떻게 null이 될 수 있습니까?
Imran Shafqat

5
null 인 경우 삽입 할 때 다음 AI 번호가 자동으로 할당됩니다.
잔인한 ...

3
IMRAN-잘 부탁드립니다. 아마도 임시 테이블의 id 필드가 PK가 자동으로 생성되지는 않았다고 생각했습니다 (SQL Server는 이러한 상황에서 그렇게하지 않을 것이라고 확신합니다). ALTER TABLE tmptable_1 MODIFY primarykeyINT NULL 을 수행해야했습니다 . 솔루션을 작동시키는 첫 번째 줄 이후
DJDave

61

Update 07/07/2014- Grim ...의 내 대답을 기반으로 한 답변 은 아래의 솔루션을 개선함에 따라 더 나은 솔루션이므로 사용하는 것이 좋습니다.

다음 구문으로 모든 열을 나열하지 않고도이 작업을 수행 할 수 있습니다.

CREATE TEMPORARY TABLE tmptable SELECT * FROM table WHERE primarykey = 1;
UPDATE tmptable SET primarykey = 2 WHERE primarykey = 1;
INSERT INTO table SELECT * FROM tmptable WHERE primarykey = 2;

다른 방법으로 기본 키를 변경하기로 결정할 수 있습니다.


16
이것은 실제 임시 테이블이 있지만 약간 더 깨끗한 작성 패턴 이지만 OP가 이미 자체 문제에 대해 제공 한 것과 동일한 솔루션 입니다. OP가 기존 구문을 정리하지 않고 이미 사용하고있는 것에 대한 더 나은 접근 방식 을 요구했다고 생각 합니다. 이것에 대한 모든 공감대를 실제로 이해하지 마십시오.
Sepster

감사합니다. 역동적 인 기능과 잘
어울립니다

이 프로세스가 완료되면 tmptable을 삭제해야합니까?
SSH 이번

"기본적으로 모든 임시 테이블은 데이터베이스 연결이 종료 될 때 MySQL에 의해 삭제됩니다. 여전히 그 사이에 삭제하려는 경우 DROP TABLE 명령을 실행하면됩니다." 자세한 내용은 여기
LeonardChallis

를 만들었 tmptable으므로 WHERE primarykey = 2마지막 행에 대한 명령문도 추가 할 필요가 없습니다 . (즉, 그냥 INSERT INTO table SELECT * FROM tmptable.)
Marcus

42

나는 당신이 새로운 레코드가 새로운 것을 갖기를 원한다고 가정합니다 primarykey. 경우 primarykey입니다 AUTO_INCREMENT그럼 그냥 이렇게 :

INSERT INTO table (col1, col2, col3, ...)
SELECT col1, col2, col3, ... FROM table
  WHERE primarykey = 1

...를 제외하고col1, col2, col3, ... 표의 모든 열이 있습니다. primarykey

AUTO_INCREMENT열 이 아니며 새 값을 선택할 수 있도록하려면 primarykey다음과 유사합니다.

INSERT INTO table (primarykey, col2, col3, ...)
SELECT 567, col2, col3, ... FROM table
  WHERE primarykey = 1

... 567의 새로운 가치는 어디입니까 primarykey?


41
질문을 무시할 때 어떻게 7 번이나 올랐습니까? ... 그러나 "select"뒤에 모든 열을 나열하고 싶지 않습니다.이 테이블에 너무 많은 열이 있기 때문입니다.
LeonardChallis

7
-1은 OP가 피하고 싶은 정확한 값이므로 -1입니다. 질문을 읽거나 최소한 "이것은 유일한 방법"과 같은 대답을 제공하십시오.
devios1

5
때로는 질문 자체가 잘못되기 때문입니다. :) 내용을 변경하지 않고 행을 복제하면 중복성이 증가합니다. 가능한 경우 중복성을 최소화하기 위해 데이터베이스 구조를 변경하는 것이 좋습니다.
Torben

5
정상적인 관행에서 옳지 않다고해서 잘못되지는 않습니다. 표준 모범 사례가 적용되지 않는 경우가 많습니다. 예 : 데이터베이스는 문서를 나타내며 사용자는 변경하기 전에 문서 사본을 보존해야합니다.
ima747

6
이 페이지를 방문하여 OP와 정확히 동일하게 원하지 않을 수도 있습니다.
jx12345

13

첫 번째 쿼리에서 거의 열을 지정해야 했으므로 삽입에서 기본 키를 제외하여 테이블에서 자동 증가를 수행하여 테이블에 대한 새 기본 키를 자동으로 만들 수 있습니다. 기입.

예를 들어 다음을 변경하십시오.

insert into table select * from table where primarykey=1

이에:

INSERT INTO table (col1, col2, col3) 
SELECT col1, col2, col3 
FROM table 
WHERE primarykey = 1

INSERT 또는 쿼리의 SELECT 부분에 대한 열 목록에 기본 키 열을 포함시키지 마십시오.


1
select 문을 통해 대부분의 열을 가져 오지만 insert 명령에서 열 중 하나를 수동으로 업데이트하는 방법이 있습니까? 같은 insert into table ("val1", col2, col3) select col2, col3 from table where primarykey = 1또는 비슷한?
anon58192932

1
그것을 발견! INSERT 문에 자신의 값 중 하나를 한 행에서 값을 복사 할 수 있지만 추가 stackoverflow.com/questions/23971078/...
anon58192932

1
죄송합니다. 귀하의 질문에 대한 알림을 받았으며, 기쁘게 생각합니다.
Braeden Black

9

테이블 덤프, 삽입 명령 찾기 및 편집을 시도 할 수도 있습니다.

mysqldump -umyuser -p mydatabase --skip-extended-insert mytable > outfile.sql

--skip-extended-insert당신에게 행 당 하나 개의 삽입 명령을 제공합니다. 그런 다음 자주 사용하는 텍스트 편집기에서 행을 찾고 명령을 추출한 후 기본 키를 "default"로 변경하십시오.


2
이것은 어떤 경우에는 런타임 외부에서 실제로 도움이 될 수있는 좋은 "외부"접근 방식이므로 +1입니다. 그러나 주로 OP의 질문을 실제로 해결하고 OP에서 이미 제공 한 솔루션을 구문 적으로 조정하지 않는 것이 첫 번째 대답입니다.
Sepster

6

이 절차는 다음을 가정합니다.

  • _duplicate_temp_table이 없습니다
  • 기본 키는 int입니다
  • 당신은 테이블을 만들 수있는 권한이

물론 이것은 완벽하지는 않지만 특정 (아마도 대부분의 경우) 효과가 있습니다.

DELIMITER $$
CREATE PROCEDURE DUPLICATE_ROW(copytable VARCHAR(255), primarykey VARCHAR(255), copyid INT, out newid INT)
BEGIN
        DECLARE EXIT HANDLER FOR SQLEXCEPTION SET @error=1;
        SET @temptable = '_duplicate_temp_table';
        SET @sql_text = CONCAT('CREATE TABLE ', @temptable, ' LIKE ', copytable);
        PREPARE stmt FROM @sql_text;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
        SET @sql_text = CONCAT('INSERT INTO ', @temptable, ' SELECT * FROM ', copytable, ' where ', primarykey,'=', copyid);
        PREPARE stmt FROM @sql_text;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
        SET @sql_text = CONCAT('SELECT max(', primarykey, ')+1 FROM ', copytable, ' INTO @newid');
        PREPARE stmt FROM @sql_text;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
        SET @sql_text = CONCAT('UPDATE ', @temptable, ' SET ', primarykey, '=@newid');
        PREPARE stmt FROM @sql_text;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
        SET @sql_text = CONCAT('INSERT INTO ', copytable, ' SELECT * FROM ', @temptable, '');
        PREPARE stmt FROM @sql_text;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
        SET @sql_text = CONCAT('DROP TABLE ', @temptable);
        PREPARE stmt FROM @sql_text;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
        SELECT @newid INTO newid;
END $$
DELIMITER ;

CALL DUPLICATE_ROW('table', 'primarykey', 1, @duplicate_id);
SELECT @duplicate_id;

1
+1 이것을 확인 works하지는 않았지만 접근 방식은 건전하며 여기에서 독특하고 실제로 OP의 질문을 다루기 때문에 가치가 있습니다.
Sepster

5

이것은 몇 가지 창의력으로 달성 할 수 있습니다.

SET @sql = CONCAT('INSERT INTO <table> SELECT null, 
    ', (SELECT GROUP_CONCAT(COLUMN_NAME) 
    FROM information_schema.columns 
    WHERE table_schema = '<database>' 
    AND table_name = '<table>' 
    AND column_name NOT IN ('id')), ' 
from <table> WHERE id = <id>');  

PREPARE stmt1 FROM @sql;
EXECUTE stmt1;

그러면 새 행이 선택한 행의 ID 대신 자동 증분 ID를 얻습니다.


이것이 정답입니다!
Felipe Desiderati

5

테이블의 기본 키 필드가 자동 증분 필드 인 경우 열과 함께 쿼리를 사용할 수 있습니다. 예를 들어, 이름 test_tbl이 지정된 테이블 에는로 3 개의 필드가 id, name, age있습니다. id은 기본 키 필드이며 자동 증분이므로 다음 쿼리를 사용하여 행을 복제 할 수 있습니다.

INSERT INTO `test_tbl` (`name`,`age`) SELECT `name`,`age` FROM `test_tbl`;

이 쿼리는 모든 행을 복제합니다.


테이블의 기본 키 필드가 자동 증분 필드가 아닌 경우 다음 방법을 사용할 수 있습니다.

INSERT INTO `test_tbl` (`id`,`name`,`age`)
  SELECT 20,`name`,`age` FROM `test_tbl` WHERE id = 19;

이 쿼리의 결과는로 id=19삽입 된 중복 행입니다 id=20.


즉, 사건은 매우 간단합니다, 최고의 응답이있다 : INSERT INTO tableName( fieldName1, fieldName2, fieldName3) SELECT fieldName1, fieldName2, fieldName3FROM tableName1 (한 번에 모두 복사) WHERE
jakubplus

두 번째-이 답변은 간결하며 실제로 행을 "복사"한다는 개념입니다.
user37309

4

업데이트 필드와 자동 증분 값이있는 복제 행

CREATE TEMPORARY TABLE `temp` SELECT * FROM `testing` WHERE id = 14;

UPDATE `temp` SET id = (SELECT id FROM testing ORDER by id DESC LIMIT 1
 )+1, user_id = 252 ,policy_no = "mysdddd12" where id = 14;

INSERT INTO `testing` SELECT * FROM `temp`;

DROP TEMPORARY TABLE IF EXISTS `temp`;

@Torben 모든 사람이 자신에게 도움이되었다는 것을 알 수 있도록 질문 왼쪽의 눈금을 확인하십시오 (승인 된 것으로 표시).
HosseyNJF

3

이 사이트에서 다음 중 일부를 수집했습니다. 이것은 여러 필드가있는 테이블의 레코드를 복제하기 위해 수행 한 작업입니다.

이것은 또한 테이블의 시작 부분에 AI 필드가 있다고 가정합니다.

function duplicateRow( $id = 1 ){
dbLink();//my db connection
$qColumnNames = mysql_query("SHOW COLUMNS FROM table") or die("mysql error");
$numColumns = mysql_num_rows($qColumnNames);

for ($x = 0;$x < $numColumns;$x++){
$colname[] = mysql_fetch_row($qColumnNames);
}

$sql = "SELECT * FROM table WHERE tableId = '$id'";
$row = mysql_fetch_row(mysql_query($sql));
$sql = "INSERT INTO table SET ";
for($i=1;$i<count($colname)-4;$i++){//i set to 1 to preclude the id field
//we set count($colname)-4 to avoid the last 4 fields (good for our implementation)
$sql .= "`".$colname[$i][0]."`  =  '".$row[$i]. "', ";
}
$sql .= " CreateTime = NOW()";// we need the new record to have a new timestamp
mysql_query($sql);
$sql = "SELECT MAX(tableId) FROM table";
$res = mysql_query($sql);
$row = mysql_fetch_row($res);
return $row[0];//gives the new ID from auto incrementing
}

3

Grim의 기술을 약간 변경하여 사용했습니다.이 쿼리를 찾는 사람이 기본 키 문제로 인해 간단한 쿼리를 수행 할 수 없기 때문에 :

INSERT INTO table SELECT * FROM table WHERE primakey=1;

MySql 설치 5.6.26을 사용하면 키를 null 수 없으며 오류가 발생합니다.

#1048 - Column 'primakey' cannot be null 

따라서 임시 테이블을 만든 후 기본 키를 nullable로 변경합니다.

CREATE TEMPORARY TABLE tmptable_1 SELECT * FROM table WHERE primarykey = 1;
ALTER TABLE tmptable_1 MODIFY primarykey int(12) null;
UPDATE tmptable_1 SET primarykey = NULL;
INSERT INTO table SELECT * FROM tmptable_1;
DROP TEMPORARY TABLE IF EXISTS tmptable_1;

또는 새 버전의 mariadb / mysql에서 primaryKey를 0으로 설정하여 삽입시 자동 증가가 작동하도록 할 수 있습니다.
shelbypereira

2

나는 이것에 늦었을 수도 있지만, 비슷한 해결책이 있습니다.

 INSERT INTO `orders` SELECT MAX(`order_id`)+1,`container_id`, `order_date`, `receive_date`, `timestamp` FROM `orders` WHERE `order_id` = 1

이렇게하면 임시 테이블 등을 만들 필요가 없습니다. 행이 동일한 테이블에 복사되므로 Max(PK)+1함수를 쉽게 사용할 수 있습니다.

나는이 질문에 대한 해결책을 찾았고 (구문을 잊어 버렸다) 나는 내 자신의 쿼리를 만들었습니다. 상황이 몇 번이나 잘 풀리는 방식이 재미 있습니다.

문안 인사


2

기본 키가 자동 증분 인 경우 기본 키를 제외한 각 필드를 지정하십시오.

INSERT INTO table(field1,field2,field3) SELECT (field1,field2,field3) FROM table WHERE primarykey=1


2

@LeonardChallis의 솔루션은 다른 어느 누구도 나를 위해 작동하지 않았으므로 업데이트했습니다. MySQL에서 WHERE조항과 SET primaryKey = 0임시 테이블을 제거하여 MySQL이 기본 키를 자동 증가시킵니다.

CREATE TEMPORARY TABLE tmptable SELECT * FROM myTable;
UPDATE tmptable SET primaryKey = 0;
INSERT INTO myTable SELECT * FROM tmptable;

이것은 물론 테이블의 모든 행 을 복제 하는 것입니다.


2

아래에서 사용하겠습니다.

insert into ORDER_ITEM select * from ORDER_ITEM where ITEM_NUMBER =123;

1
ITEM_NUMBER가 기본 키인 경우에는 작동하지 않으며이 상황에서 발생할 수 있습니다.
Billy Pilgrim

2

Koha 데이터베이스 에서 바코드 열에 'C'접두사가 붙은 중복 항목을 삽입 하는 데 사용했습니다 .

INSERT INTO items (`biblionumber`, `biblioitemnumber`, `barcode`, `dateaccessioned` ) SELECT `biblionumber`, `biblioitemnumber`,  CONCAT('C',`barcode`), `dateaccessioned` FROM `items` WHERE barcode='14832';

1

방금이 작업을 수행해야했으며 이것이 내 수동 솔루션이었습니다.

  1. 에서 phpMyAdmin에 , 복사 할 행을 확인
  2. 쿼리 결과 작업 아래에서 '내보내기'를 클릭하십시오.
  3. 다음 페이지에서 '파일로 저장' 을 확인한 다음 '이동' 을 클릭하십시오
  4. 텍스트 편집기로 내 보낸 파일을 열고 기본 필드의 값을 찾아 고유 한 값으로 변경하십시오.
  5. 돌아 가기 하면 phpMyAdmin 온 클릭 '가져 오기' 탭에서 .SQL 파일을 가져올 파일의 위치를 찾아 클릭 '이동' 과 중복 행이 삽입되어야한다.

PRIMARY 필드가 무엇인지 모르는 경우 phpmyadmin 페이지를 다시 살펴보고 'Structure' 탭을 클릭 하고 페이지 하단의 'Indexes' 아래 에 'Keyname' 이있는 ' Field' 가 표시됩니다 'PRIMARY' 값 .

일종의 먼 길이지만 마크 업을 처리하고 싶지 않고 단일 행을 복제 해야하는 경우가 있습니다.


좋은 방법으로 상자 밖에서 작전에 응답합니다. Blob 및 지리 공간 데이터와 같은 모든 경우에 작동하지는 않지만 쉽게 제거 할 수 있으며 이상한 공 변화에 효과적입니다.
Strixy

1

이 솔루션은 선택된 행에도 완벽하게 작동한다는 것을 보여주었습니다. 예를 들어 nice2work 프로젝트에 대한 데모 행을 작성 중이며 완벽하게 작동합니다.

CREATE TEMPORARY TABLE tmptable SELECT * FROM myTable WHERE id=500;
UPDATE tmptable SET id = 0;
UPDATE some fields I need to change
INSERT INTO myTable SELECT * FROM tmptable;
DROP TABLE tmptable;

//  You can use this same also directly into your code like (PHP Style)
$sql = "CREATE TEMPORARY TABLE tmptable SELECT * FROM myTable WHERE id=500;
UPDATE tmptable SET id = 0;
UPDATE some fields I need to change
INSERT INTO myTable SELECT * FROM tmptable;DROP TABLE tmptable;";

0

네크로 포스트는 미안하지만 이것은 구글로 밝혀졌으며 이것이 도움이되었지만 문제가 있음을 알게 된 이후 이것을 파는 다른 사람에게 중요한 수정을하고자했습니다.

먼저 MySQL이 아닌 SQL Server를 사용하고 있지만 비슷하게 작동해야한다고 생각합니다. Leonard Challis의 솔루션은 가장 간단하고 필요를 충족했기 때문에 사용했지만 문제가 있습니다 .PK를 가져 와서 1 씩 늘리면 문제의 행이 추가 된 후 다른 레코드를 추가하면 어떻게됩니까? . 시스템이 PK의 자동 증가를 처리하도록하는 것이 최선이라고 결정했기 때문에 다음을 수행했습니다.

SELECT * INTO #tmpTable FROM Table WHERE primarykey = 1
--Optionally you can modify one or more fields here like this: 
--UPDATE #tmpTable SET somefield = newData
ALTER TABLE #tmpTable DROP COLUMN TicketUpdateID
INSERT INTO Tickets SELECT * FROM #tmpTable
DROP TABLE #tmpTable

나는 이것이 MySQL에서 비슷하게 작동한다고 생각하지만 이것을 테스트 할 수는 없다. 미안


1
완전히 bakwaas 답변
AsadYarKhan

0

나는 그것이 오래된 질문이라는 것을 알고 있지만 여기에 다른 해결책이 있습니다.

기본 키가 자동 증분이라고 가정하면 기본 테이블의 행이 복제되고 새 기본 테이블 ID로 연결된 테이블 데이터의 사본이 작성됩니다.

열 이름을 얻는 다른 옵션 :
-SHOW COLUMNS FROM tablename; (열 이름 : 필드)
-DESCRIBE tablename (열 이름 : 필드)
-SELECT column_name FROM information_schema.columns WHERE table_name = 'tablename'(열 이름 : column_name)

//First, copy main_table row
$ColumnHdr='';
$Query="SHOW COLUMNS FROM `main_table`;";
$Result=Wrappedmysql_query($Query,$link,__FILE__,__LINE__);
while($Row=mysql_fetch_array($Result))
{
    if($Row['Field']=='MainTableID')     //skip main table id in column list
        continue;
    $ColumnHdr.=",`" . $Row['Field'] . "`";
}
$Query="INSERT INTO `main_table` (" . substr($ColumnHdr,1) . ")
        (SELECT " . substr($ColumnHdr,1) . " FROM `main_table`
            WHERE `MainTableID`=" . $OldMainTableID . ");";
$Result=Wrappedmysql_query($Query,$link,__FILE__,__LINE__);
$NewMainTableID=mysql_insert_id($link);

//Change the name (assumes a 30 char field)
$Query="UPDATE `main_table` SET `Title`=CONCAT(SUBSTRING(`Title`,1,25),' Copy') WHERE `MainTableID`=" . $NewMainTableID . ";";
$Result=Wrappedmysql_query($Query,$link,__FILE__,__LINE__);

//now copy in the linked tables
$TableArr=array("main_table_link1","main_table_link2","main_table_link3");
foreach($TableArr as $TableArrK=>$TableArrV)
{
    $ColumnHdr='';
    $Query="SHOW COLUMNS FROM `" . $TableArrV . "`;";
    $Result=Wrappedmysql_query($Query,$link,__FILE__,__LINE__);
    while($Row=mysql_fetch_array($Result))
    {
        if($Row['Field']=='MainTableID')     //skip main table id in column list, re-added in query
            continue;
        if($Row['Field']=='dbID')    //skip auto-increment,primary key in linked table
            continue;
        $ColumnHdr.=",`" . $Row['Field'] . "`";
    }

    $Query="INSERT INTO `" . $TableArrV . "` (`MainTableID`," . substr($ColumnHdr,1) . ")
            (SELECT " . $NewMainTableID . "," . substr($ColumnHdr,1) . " FROM `" . $TableArrV . "`
             WHERE `MainTableID`=" . $OldMainTableID . ");";
    $Result=Wrappedmysql_query($Query,$link,__FILE__,__LINE__);
}

0

적어도 자동 증가 사례의 경우 max233이 올바른 궤도에 올랐습니다. 그러나 ALTER TABLE을 수행하지 마십시오. 임시 테이블의 자동 증가 필드를 NULL로 설정하기 만하면됩니다. 이로 인해 오류가 발생하지만 임시 테이블의 모든 필드에 대해 다음 INSERT가 발생하고 NULL 자동 필드는 고유 한 값을 얻습니다.


0

테이블 만들기

    CREATE TABLE `sample_table` (
       `sample_id` INT(10) unsigned NOT NULL AUTO_INCREMENT,
       `sample_name` VARCHAR(255) NOT NULL,
       `sample_col_1` TINYINT(1) NOT NULL,
       `sample_col_2` TINYINT(2) NOT NULL,

      PRIMARY KEY (`sample_id`),
      UNIQUE KEY `sample_id` (`sample_id`)

    ) ENGINE='InnoDB' DEFAULT CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';

행 삽입

INSERT INTO `sample_table`
   VALUES(NULL, 'sample name', 1, 2);

위의 복제 행 삽입

INSERT INTO `sample_table`
   SELECT 
    NULL AS `sample_id`, -- new AUTO_INCREMENT PRIMARY KEY from MySQL
    'new dummy entry' AS `sample_name`,  -- new UNIQUE KEY from you
    `sample_col_1`, -- col from old row
    `sample_col_2` -- col from old row
   FROM `sample_table`
   WHERE `sample_id` = 1;

테스트

SELECT * FROM `sample_table`;

참고 : 오류가 발생하면 (# 1048) NULL 대신 ''을 사용하십시오
Abdullah Aydın

이 날 경우, 또는이는 정확히 영업 이익이 무엇을 하지 않았다 싶어? (즉, 수동으로 모든 열을 쿼리에 추가합니다.)
Byson

당신은 맞습니다. OP의 "동일한 테이블에 삽입하기 위해 하나의 행을 복사하고 싶습니다"라는 문장을 읽었을 것입니다. 어쨌든 이것은 여전히 ​​"키의 중복 항목 'xxx'에 유용합니다." error ^^
Abdullah Aydın

0

이 사이트에서 온라인으로 찾은 답변입니다. 위의 방법을 설명합니다 1 페이지 하단에서 답변을 찾을 수 있습니다. 기본적으로 수행하는 작업은 메모리에 보관 된 임시 테이블에 복사 할 행을 복사하는 것입니다. 그런 다음 업데이트를 사용하여 기본 키 번호를 변경하십시오. 그런 다음 대상 테이블에 다시 삽입하십시오. 그런 다음 테이블을 삭제하십시오.

이것은 그것을위한 코드입니다 :

TEMPORARY TABLE rescueteamENGINE = MEMORY SELECT * FROM fitnessreport4어디에서 rID = 1; # 1 행이 영향을받습니다. UPDATE rescueteamSET rID = Null 어디에서 rID = 1; # 1 개의 행이 영향을 받음 fitnessreport4SELECT INTO SELECT * FROM rescueteam; # 1 개의 행이 영향을받습니다. DROP TABLE rescueteam# MySQL은 빈 결과 집합 (즉, 0
행)을 반환했습니다 .

임시 테이블 구조 팀을 만들었습니다. 원래 테이블 fitnessreport4에서 행을 복사했습니다. 그런 다음 임시 테이블의 행에 대한 기본 키를 null로 설정하여 중복 키 오류가 발생하지 않고 원래 테이블로 다시 복사 할 수 있습니다. 어제 저녁 에이 코드를 시도해 보았습니다.


0

이것은 "Grim ..."의 답변에 대한 추가 솔루션입니다. 기본 키가 null 인 주석이 있습니다. 작동하지 않는 것에 대한 의견. 솔루션에 대한 의견도 있습니다. 어떤 해결책도 우리에게 효과가 없었습니다. InnoDB 테이블이있는 MariaDB가 있습니다.

null을 허용하도록 기본 키를 설정할 수 없습니다. NULL 대신 0을 사용하면 기본 키에 대한 중복 값 오류가 발생했습니다. SET SQL_SAFE_UPDATES = 0;작동하지 않았습니다.

PRIMARY KEY를 UNIQUE로 변경하면 "Grim ..."의 솔루션이 작동했습니다.


-1

필자는 PHP 코드를 게시하고 싶었습니다. 열을 수집하는 방식이 이전 예제보다 코드에서 약간 깨끗하다고 ​​생각하기 때문입니다. 또한 필드를 쉽게 변경하는 방법 (이 경우 문자열 추가)을 보여줍니다. 그러나 일부 하위 레코드를 복사하려는 경우 외래 키 필드를 새로 추가 된 레코드로 바꿀 수도 있습니다.

  // Read columns, unset the PK (always the first field in my case)
  $stmt = $conn->prepare('SHOW COLUMNS FROM template');
  $stmt->execute();

  $columns = $stmt->fetchAll();
  $columns = array_map(function ($element) { return $element['Field']; }, $columns);

  unset($columns[0]);

  // Insert record in the database. Add string COPY to the name field.
  $sql = "INSERT INTO `template` (".implode(",", $columns).")";
  if ($key = array_search('name', $columns))
      $columns[$key] = "CONCAT(name, ' COPY')";
  $sql .= " SELECT ".implode(",", $columns)." FROM `template` WHERE `id` = ".$id;

  $stmt = $conn->prepare($sql);
  $stmt->execute();

-2

매우 간단한 해결책으로 PHPMyAdmin을 사용하여 행을 CSV 파일로 내 보낸 다음 수정 된 CSV 파일을 가져 오기만하면됩니다. ID / 기본 키 열을 편집하여 가져 오기 전에 값을 표시하지 않습니다.

SELECT * FROM table where primarykey=1

그런 다음 페이지 하단에서

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

"내보내기"는 단순히 내보내기, csv 파일을 편집하여 기본 키 값을 제거하므로 비어있는 다음 데이터베이스로 가져 오면 가져 오기시 새 기본 키가 할당됩니다.

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