테이블의 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)
시도할 수 있습니다.
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
'programing' 카테고리의 다른 글
정규 분포 그림을 그리는 방법 (0) | 2023.07.15 |
---|---|
도커 구성 작업이지만 비주얼 스튜디오 코드 개발 컨테이너를 사용하면 작업이 수행되지 않습니다. (0) | 2023.07.15 |
화력 기지 내 자유 계획의 제한 (0) | 2023.07.10 |
"org.springframework"를 호출할 수 없습니다.web.servlet.mvc.condition."this.condition"이(가) null이기 때문에 PatternsRequestCondition.getPatterns()"입니다. (0) | 2023.07.10 |
최대 평균을 찾는 방법 (0) | 2023.07.10 |