스 퀀스 번호 / 문자 또는 고유 한 데이터로 기존 행 업데이트


13

표 X에 새 열을 추가했습니다.

이 열 "cn"은 고유하고 필수 여야하지만 오래된 데이터에는 아무런 가치가 없습니다.

순차 또는 임의의 고유 데이터로 기존 레코드를 업데이트하는 방법은 무엇입니까?

감사합니다.

답변:


11

열을 이미 생성했다고 생각하지만이 답변에서는 열이 아직 존재하지 않는다고 가정합니다. IMO, 고유 필요한 열이해야 결코기존 행을 먼저 채우는 방법을 계획하지 않고 추가 . 따라서이 작업을 수행하는 방법은 0부터 시작하겠습니다.


이를 수행하는 방법은 값을 채우는 것과 관련된 내용에 따라 다릅니다.

어떤 방법을 사용하든 데이터 무결성을 보장하기 위해 열에 고유 한 제약 조건을 추가하십시오. 방법 1과 2의 경우 단일 명령문 또는 사용자 트랜잭션 (미도시) 내에서 수행 할 수 있으며 방법 3의 사용자 트랜잭션 내에서 수행해야합니다.

이 작업을 수행하는 몇 가지 다른 모호한 방법이 있지만 가장 일반적인 방법을 다루었다고 생각합니다.


방법 1 : IDENTITY 열 추가

ALTER TABLE MyTable ADD MyColumn int IDENTITY(1, 2) NOT NULL

그러면 테이블의 모든 행이 시드 값 (1)으로 시작하여 모든 행의 증분 값 (2)만큼 증가하는 정수 값으로 채워집니다. 값을 채우는 순서가 정의되어 있지 않다고 생각합니다 (주문을 지정 해야하는 경우 방법 3을 사용하십시오).


방법 2 : 기본 제약 조건을 사용하여 채우기

ALTER TABLE MyTable ADD MyColumn uniqueidentifier NOT NULL
    CONSTRAINT DF_MyTable_MyColumn
        DEFAULT (NEWSEQUENTIALID())

이렇게하면 세 가지 작업이 원자 적으로 수행됩니다. 1. 허용되지 않는 열 추가 NULL 값을 합니다. 2. 열에 대한 기본 제한 조건을 작성하십시오. 3. 기본 제한 조건을 사용하여 테이블의 각 행을 채우십시오.

이 예제는 uniqueidentifier 열을 모든 데이터 유형 및 기본 제약 조건과 마찬가지로 작동합니다.


방법 3 : UPDATE 문을 사용하여 채우기

예를 들어, 애플리케이션의 다른 부분에서 테이블에 추가해야하는 값이 있거나 고유 한 값의 정확한 순서를 지정해야하는 경우에 이러한 상황이 발생합니다.

BEGIN TRANSACTION

    ALTER TABLE MyTable ADD MyColumn int NULL

    UPDATE MyTable
        SET MyColumn = ...

    ALTER TABLE MyTable ALTER COLUMN MyColumn int NOT NULL

COMMIT TRANSACTION

방법 4 : SEQUENCE 개체를 사용하여 채우기

SQL Server 2012의 경우 SEQUENCE개체에 의해 생성 된 값을 사용하여 열을 채울 수 있습니다. 아직이 작업을 수행하지 않았으므로 MSDN 문서 를 참조하십시오 .


감사합니다. 첫 번째 답변과 함께 방법 3을 사용했습니다. update T set cn = rn from (select cn, row_number () over (order by (select 1)) rn as TableX에서 rn) T
med_alpa

시퀀스 사용의 예 (mysequence라는 시퀀스가 ​​있다고 가정) :update mytable set mycolumn = next value for mysequence where mycolumn is null;
Endy Tjahjono

14

1부터 시작하는 숫자에 만족하면을 사용할 수 있습니다 row_number().

update T
set cn = rn
from (
       select cn,
              row_number() over(order by (select 1)) as rn
       from TableX
     ) T


0

시퀀스를 사용하여 업데이트하려면 이것을 시도하십시오 ... 업데이트 명령문의 order by 절로 인해 TOP을 수행해야합니다. 이 문장을 SQL SERVER 2012에서 사용했습니다.

update invoice set RecNo = (next value for seq_invoice_recno)
where invoiceid in (select top 100000 invoiceid from invoice where RecNo is null 
order by invoiceId)

-1

그리고이 모든 것이 여전히 작동하지 않으면 (아마도 오래된 SQL-92이기 때문에) Ziggy Crueltyfree Zeitgeister가 제안한대로 여기 를 여러 단계로 나눌 수 있습니다 .

CREATE TABLE sorting (sid numeric(10,10), rn int);

INSERT INTO sorting (sid, rn)
SELECT SortID, RecordNumber FROM Beleg
WHERE Year ( Valuta ) = 2016
AND Ursprungskonto = 1210
ORDER BY SortID;

UPDATE Beleg SET SortID = (SELECT rn FROM sorting WHERE sid=Beleg.SortID)
WHERE Year ( Valuta ) = 2016
AND Ursprungskonto = 1210;

DROP TABLE sorting;

이게 뭐야 RecordNumber? 독점적 인 Filemaker 기능 / 기능처럼 보입니다. SQL Server에는 적용되지 않으며 SQL 92 표준에는 적용되지 않습니다.
ypercubeᵀᴹ

네 말이 맞아. RecordNumber는 Filemaker에서 정의 할 수있는 계산 된 열로, 화면에 표시 될 때와 정렬 한 후 (Filemaker 별) 각 행의 레코드 번호를 보유합니다.
Gary Czychi

좋아, 잘 몰랐어 그러나 여기의 질문에는 태그가 Filemaker없으므로 대답이 관련이 없다고 생각합니다. 임시 테이블을 사용하고 해당 열을 ROW_NUMBER()함수로 채울 수 있습니다 .
ypercubeᵀᴹ
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.