SQL 테이블의 레코드를 복사하면서 새 행의 고유 ID를 스왑 아웃하려면 어떻게 해야 합니까?
이 질문은 제가 필요로 하는 것에 가깝지만, 제 시나리오는 약간 다릅니다.원본 테이블과 대상 테이블이 동일하고 기본 키가 고유 식별자(가이드)입니다.시도할 때:
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"-열은 ID 열이며 이 열만 지정해야 합니다.어차피 반대로 하는 것보다는 나아요 :-)
SQL Server를 사용합니다."를 사용할 수 있습니다.CREATE TABLE
그리고 "UPDATE TABLE
1열과 2열에흠, 나는 그가 원하는 대답을 제대로 하지 않은 것을 보았습니다.그는 또한 ID를 다른 열에 복사하기를 원했습니다.하지만 이 솔루션은 새로운 자동 ID로 복사본을 만드는 데 유용합니다.
저는 마이클 디베츠의 아이디어로 해결책을 수정합니다.
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로 대체해야 합니다.내 데이터베이스, 내 테이블 및 색인 필드는 사용자 이름으로 대체되어야 합니다(물론).
모든 칼럼 이름을 쓰는 것을 피하려는 것 같습니다.SQL Management Studio를 사용하는 경우 테이블을 마우스 오른쪽 버튼으로 클릭하고 Script As Insert를 쉽게 클릭할 수 있습니다.그런 다음 해당 출력을 사용하여 쿼리를 만들 수 있습니다.
ID 필드를 제외한 모든 필드를 지정합니다.
INSERT INTO MyTable (FIELD2, FIELD3, ..., FIELD529, PreviousId)
SELECT FIELD2, NULL, ..., FIELD529, FIELD1
FROM MyTable
WHERE FIELD1 = @Id;
다른 개발자가 주기적으로 추가한 열이 있는 테이블에서 단일 스크립트를 사용하는 것과 같은 문제가 있습니다.뿐만 아니라 고객이 최신 버전을 모두 사용하지 않을 수도 있기 때문에 다양한 버전의 데이터베이스를 지원하고 있습니다.
저는 조나스의 솔루션을 받아서 약간 수정했습니다.이렇게 하면 행의 복사본을 만든 다음 원래 원본 테이블에 다시 추가하기 전에 기본 키를 변경할 수 있습니다.또한 열에 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;
저는 제 대답이 파티에 늦었다는 것을 압니다.하지만 제가 해결한 방법은 모든 답과 조금 다릅니다.
상황이 발생했습니다. 몇 개의 열을 제외한 테이블의 행을 복제해야 합니다.그 소수의 사람들은 새로운 가치를 갖게 될 것입니다.이 프로세스는 나중에 테이블을 변경할 수 있도록 자동으로 지원해야 합니다.즉, 열 이름을 지정하지 않고 레코드를 복제해야 합니다.
제 접근법은,
- 시스템 쿼리.테이블에 대한 열의 전체 목록을 가져오고 where 절에서 건너뛸 열의 이름을 포함하는 열.
- 열 이름으로 CSV로 변환합니다.
- 빌드 선택...이를 기준으로 스크립트에 삽입합니다.
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
키가 PK 필드이고 자동 숫자인 경우.
insert into MyTable (field1, field2, field3, parentkey)
select field1, field2, null, key from MyTable where uniqueId = @Id
원래 레코드에서 필드 1과 필드 2를 복사하여 새 레코드를 생성합니다.
제 테이블에는 100개의 필드가 있고, 저는 그냥 일하기 위해 질문이 필요했습니다.이제 기본적인 조건부 논리를 사용하여 임의의 수의 필드를 전환할 수 있으며, 순서 위치에 대해 걱정할 필요가 없습니다.
아래 테이블 이름을 테이블 이름으로 바꾸기
SQLcolums = "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE (TABLE_NAME = 'TABLE-NAME')" Set GetColumns = Conn.Execute(SQLcolums) Do WHILE not GetColumns.eof colName = GetColumns("COLUMN_NAME")
원래 ID 필드 이름을 PK 필드 이름으로 바꾸기
IF colName = "ORIGINAL-IDENTITY-FIELD-NAME" THEN ' ASSUMING THAT YOUR PRIMARY KEY IS THE FIRST FIELD DONT WORRY ABOUT COMMAS AND SPACES columnListSOURCE = colName columnListTARGET = "[PreviousId field name]" ELSE columnListSOURCE = columnListSOURCE & colName columnListTARGET = columnListTARGET & colName END IF GetColumns.movenext loop GetColumns.close
이름 다시 , 사용자의 테이블 이름을 합니다.
where
SQL = "INSERT INTO TARGET-TABLE-NAME (" & columnListTARGET & ") SELECT " & columnListSOURCE & " FROM SOURCE-TABLE-NAME WHERE (FIELDNAME = FIELDVALUE)" Conn.Execute(SQL)
다음과 같이 할 수 있습니다.
INSERT INTO DENI/FRIEN01P
SELECT
RCRDID+112,
PROFESION,
NAME,
SURNAME,
AGE,
RCRDTYP,
RCRDLCU,
RCRDLCT,
RCRDLCD
FROM
FRIEN01P
여기에 112 대신 최대 ID 번호를 표 DENI/FRIEN01P에 넣어야 합니다.
ASP Classic을 사용하여 작업을 수행한 방법은 다음과 같습니다. 위의 답변과 함께 작업할 수 없습니다. 시스템에 있는 제품을 새 product_id에 복사할 수 있고 테이블에 열을 더 추가하더라도 작업할 수 있어야 했습니다.
Cn.Execute("CREATE TEMPORARY TABLE temprow AS SELECT * FROM product WHERE product_id = '12345'")
Cn.Execute("UPDATE temprow SET product_id = '34567'")
Cn.Execute("INSERT INTO product SELECT * FROM temprow")
Cn.Execute("DELETE temprow")
Cn.Execute("DROP TABLE temprow")
언급URL : https://stackoverflow.com/questions/149784/how-do-you-copy-a-record-in-a-sql-table-but-swap-out-the-unique-id-of-the-new-ro
'code' 카테고리의 다른 글
단위 테스트와 함께 애플리케이션 통찰력을 사용하시겠습니까? (0) | 2023.05.08 |
---|---|
텍스트 상자를 부동값으로 바인딩합니다.도트/콤마를 입력할 수 없습니다. (0) | 2023.05.08 |
일부 Microsoft 언어를 "Visual"이라고 부르는 이유는 무엇입니까? (Visual C#, Visual Basic)NET, 비주얼 C++) (0) | 2023.05.08 |
git: 'incential-cache'는 git 명령이 아닙니다. (0) | 2023.05.08 |
npm 설치와 업데이트 - 차이점은 무엇입니까? (0) | 2023.05.08 |