[sql] SQL 테이블의 레코드를 복사하지만 새 행의 고유 ID를 바꾸는 방법은 무엇입니까?

이 질문 은 내가 필요로하는 것에 가깝지만 내 시나리오는 약간 다릅니다. 원본 테이블과 대상 테이블이 동일하고 기본 키는 고유 식별자 (guid)입니다. 내가 이것을 시도 할 때 :

insert into MyTable
    select * from MyTable where uniqueId = @Id;

기본 키를 복사하려고하기 때문에 분명히 기본 키 제약 조건 위반이 발생합니다. 사실, 저는 기본 키를 전혀 복사하고 싶지 않습니다. 차라리 새로 만들고 싶습니다. 또한 특정 필드를 선택적으로 복사하고 나머지는 null로두고 싶습니다. 문제를 더 복잡하게 만들기 위해 원본 레코드의 기본 키를 가져와 복사본의 다른 필드 (PreviousId 필드)에 삽입해야합니다.

나는 이것에 대한 쉬운 해결책이 있다고 확신합니다. 나는 그것이 무엇인지 알기에 충분한 TSQL을 모릅니다.



답변

이 시도:


insert into MyTable(field1, field2, id_backup)
    select field1, field2, uniqueId from MyTable where uniqueId = @Id;

지정되지 않은 모든 필드는 기본값 (정의되지 않은 경우 일반적으로 NULL)을 받아야합니다.


답변

좋아, 나는 그것이 오래된 문제라는 것을 알고 있지만 어쨌든 내 대답을 게시합니다.

이 솔루션이 마음에 듭니다. ID 열만 지정하면됩니다.

SELECT * INTO TempTable FROM MyTable_T WHERE id = 1;
ALTER TABLE TempTable DROP COLUMN id;
INSERT INTO MyTable_T SELECT * FROM TempTable;
DROP TABLE TempTable;

“id”-열은 식별 열이며 내가 지정해야하는 유일한 열입니다. 어쨌든 다른 방법보다 낫습니다. 🙂

SQL Server를 사용합니다. 행 1과 2에 ” CREATE TABLE“및 ” UPDATE TABLE” 를 사용할 수 있습니다 . 음, 그가 원하는 답을 실제로 제공하지 않은 것을 보았습니다. 그는 ID를 다른 열에도 복사하고 싶었습니다. 그러나이 솔루션은 새로운 자동 ID로 복사본을 만드는 데 유용합니다.

Michael Dibbets의 아이디어로 솔루션을 편집합니다.

use MyDatabase;
SELECT * INTO #TempTable FROM [MyTable] WHERE [IndexField] = :id;
ALTER TABLE #TempTable DROP COLUMN [IndexField];
INSERT INTO [MyTable] SELECT * FROM #TempTable;
DROP TABLE #TempTable;

둘 이상의 열을 “,”로 구분하여 삭제할 수 있습니다. : id는 복사하려는 행의 ID로 바꿔야합니다. MyDatabase, MyTable 및 IndexField는 물론 이름으로 바꿔야합니다.


답변

나는 당신이 모든 열 이름을 쓰지 않으려 고 노력하고 있다고 생각합니다. SQL Management Studio를 사용하는 경우 테이블과 Script As Insert를 쉽게 마우스 오른쪽 단추로 클릭합니다. 그러면 해당 출력을 사용하여 쿼리를 생성 할 수 있습니다.


답변

ID 필드를 제외한 모든 필드를 지정하십시오.

INSERT INTO MyTable (FIELD2, FIELD3, ..., FIELD529, PreviousId)
SELECT FIELD2, NULL, ..., FIELD529, FIELD1
FROM MyTable
WHERE FIELD1 = @Id;


답변

다른 개발자가 주기적으로 추가 한 열이있는 테이블에서 단일 스크립트를 사용하려는 동일한 문제가 있습니다. 뿐만 아니라 고객이 모두 현재 버전을 최신 상태로 유지하지 못할 수 있으므로 다양한 버전의 데이터베이스를 지원하고 있습니다.

Jonas의 솔루션을 가져와 약간 수정했습니다. 이렇게하면 행의 복사본을 만든 다음 원래 소스 테이블에 다시 추가하기 전에 기본 키를 변경할 수 있습니다. 이것은 또한 열에 NULL 값을 허용하지 않고 INSERT에 각 열 이름을 지정하지 않아도되는 테이블 작업에 매우 유용합니다.

이 코드는 ‘ABC’행을 ‘XYZ’로 복사합니다.

SELECT * INTO #TempRow FROM SourceTable WHERE KeyColumn = 'ABC';
UPDATE #TempRow SET KeyColumn = 'XYZ';
INSERT INTO SourceTable SELECT * FROM #TempRow;
DELETE #TempRow;

삭제가 끝나면 임시 테이블을 삭제하십시오.

DROP TABLE #TempRow;


답변

내 대답이 파티에 늦었 음을 압니다. 그러나 내가 해결 한 방식은 모든 답변과 약간 다릅니다.

상황이 발생하여 몇 개의 열을 제외하고 테이블의 행을 복제해야합니다. 그 소수는 새로운 가치를 갖게 될 것입니다. 이 프로세스는 향후 테이블 변경을 자동으로 지원해야합니다. 이는 열 이름을 지정하지 않고 레코드를 복제 함을 의미합니다.

내 접근 방식은

  1. Sys.Columns를 쿼리하여 테이블의 전체 열 목록을 가져오고 where 절에서 건너 뛸 열 이름을 포함합니다.
  2. 열 이름으로 CSV로 변환하십시오.
  3. 빌드 선택 … 이것을 기반으로 스크립트에 삽입합니다.

declare @columnsToCopyValues varchar(max), @query varchar(max)
SET @columnsToCopyValues = ''

--Get all the columns execpt Identity columns and Other columns to be excluded. Say IndentityColumn, Column1, Column2 Select @columnsToCopyValues = @columnsToCopyValues + [name] + ', ' from sys.columns c where c.object_id = OBJECT_ID('YourTableName') and name not in ('IndentityColumn','Column1','Column2') Select @columnsToCopyValues = SUBSTRING(@columnsToCopyValues, 0, LEN(@columnsToCopyValues)) print @columnsToCopyValues

Select @query = CONCAT('insert into YourTableName (',@columnsToCopyValues,', Column1, Column2) select ', @columnsToCopyValues, ',''Value1'',''Value2'',', ' from YourTableName where IndentityColumn =''' , @searchVariable,'''')

print @query exec (@query)


답변

insert into MyTable (uniqueId, column1, column2, referencedUniqueId)
select NewGuid(), // don't know this syntax, sorry
  column1,
  column2,
  uniqueId,
from MyTable where uniqueId = @Id