programing

테이블의 int 열을 고유한 증분 값으로 업데이트

magicmemo 2023. 7. 10. 22:15
반응형

테이블의 int 열을 고유한 증분 값으로 업데이트

해당 행에 값이 누락된 행을 채우려고 합니다.InterfaceID (INT)행당 고유한 값이 있는 열입니다.

이 질문을 하려고 합니다.

UPDATE prices SET interfaceID = (SELECT ISNULL(MAX(interfaceID),0) + 1 FROM prices) 
       WHERE interfaceID IS null

나는 그들이(SELECT ISNULL(MAX(interfaceID),0) + 1 FROM prices)모든 행에 대해 평가되지만 한 번만 수행되므로 영향을 받는 모든 행은 서로 다른 값 대신 동일한 값을 얻습니다.

이 작업을 단일 쿼리로 수행할 수 있습니까?

declare @i int  = (SELECT ISNULL(MAX(interfaceID),0) + 1 FROM prices)


update prices
set interfaceID  = @i , @i = @i + 1
where interfaceID is null

그 일을 해야 합니다.

DECLARE @IncrementValue int
SET @IncrementValue = 0 
UPDATE Samples SET qty = @IncrementValue,@IncrementValue=@IncrementValue+1

간단한 쿼리는 원하는 숫자로 변수를 설정하는 것입니다.그런 다음 해당 숫자에서 1을 늘려 필요한 열을 업데이트합니다.모든 행에 대해 각 행 ID를 1씩 증가시켜 업데이트합니다.

SET @a  = 50000835 ;  
UPDATE `civicrm_contact` SET external_identifier = @a:=@a+1 
WHERE external_identifier IS NULL;

CTE 또는 WITH를 사용할 뿐만 아니라 이 테이블에 대한 기본 키가 있다고 가정하면 동일한 테이블에 자체 조인하는 업데이트를 사용할 수도 있습니다.

UPDATE a
SET a.interfaceId = b.sequence
FROM prices a
INNER JOIN
(
   SELECT ROW_NUMBER() OVER ( ORDER BY b.priceId ) + ( SELECT MAX( interfaceId ) + 1 FROM prices ) AS sequence, b.priceId
   FROM prices b
   WHERE b.interfaceId IS NULL
) b ON b.priceId = a.priceId

기본 키는 price-id라고 가정했습니다.

파생 테이블인 별칭 b는 기본 키 열과 함께 ROW_NUMBER() 함수를 통해 시퀀스를 생성하는 데 사용됩니다.열 interface-id가 NULL인 각 행에 대해 기본 키 값과 함께 고유한 시퀀스 값을 가진 행이 생성됩니다.

기본 키가 아닌 다른 순서로 시퀀스를 정렬할 수 있습니다.

시퀀스는 하위 쿼리를 통해 현재 MAX 인터페이스 ID + 1로 오프셋됩니다.MAX() 함수는 NULL 값을 무시합니다.

WHERE 절은 NULL인 행으로 업데이트를 제한합니다.

그런 다음 파생 테이블이 동일한 테이블에 결합됩니다. 즉, 별칭 a는 업데이트할 열이 생성된 시퀀스로 설정된 상태에서 기본 키 열에 결합됩니다.

우편물용

ALTER TABLE table_name ADD field_name serial PRIMARY KEY

참조: https://www.tutorialspoint.com/postgresql/postgresql_using_autoincrement.htm

오라클 기반 제품에서는 다음 문장을 사용할 수 있습니다.

update table set interfaceID=RowNum where condition;

다음과 같은 방법을 사용해 보십시오.

with toupdate as (
    select p.*,
           (coalesce(max(interfaceid) over (), 0) +
            row_number() over (order by (select NULL))
           ) as newInterfaceId
    from prices
   )
update p
    set interfaceId = newInterfaceId
    where interfaceId is NULL

이것은 그것들을 연속적으로 만들지는 않지만, 새로운 더 높은 ID를 할당합니다.연속적으로 설정하려면 다음을 수행합니다.

with toupdate as (
    select p.*,
           (coalesce(max(interfaceid) over (), 0) +
            row_number() over (partition by interfaceId order by (select NULL))
           ) as newInterfaceId
    from prices
   )
update p
    set interfaceId = newInterfaceId
    where interfaceId is NULL

제 테이블에는 5억 개의 레코드가 있습니다.아래 코드가 저에게 효과가 있었습니다.

-- update rows using a CTE - Ervin Steckl 

;WITH a AS(
SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) as rn, id
FROM accounts2
) 
UPDATE a SET id=rn
OPTION (MAXDOP 1)

https://www.mssqltips.com/sqlservertip/1467/populate-a-sql-server-column-with-a-sequential-number-not-using-an-identity/

시도할 수 있습니다.

DECLARE @counter int
SET @counter = 0
UPDATE [table]
SET [column] = @counter, @counter = @counter + 1```

언급URL : https://stackoverflow.com/questions/13629382/update-int-column-in-table-with-unique-incrementing-values

반응형