programing

하나의 IDENTITY 열만있는 테이블에 행 삽입

nasanasas 2020. 10. 19. 08:08
반응형

하나의 IDENTITY 열만있는 테이블에 행 삽입


기본 키인 하나의 열인 adminId 만있는 테이블 관리자가 있습니다. 비즈니스 규칙 때문에 이런 식이어야합니다.

이와 같은 테이블에 값을 삽입하는 저장 프로 시저를 작성하는 방법을 한 번 이해하고 싶습니다. SQL Server와 T-SQL을 사용하고 있으며 SCOPE_IDENTITY ()를 사용해 보았지만 테이블에 INSERT_IDENTITY가 false 또는 off이기 때문에 작동하지 않습니다.

새 행을 삽입 할 수 있도록 더미 값을 삽입하지 않고 싶습니다. 감사!


IDENTITY 인 열이 하나있는 경우 다음을 수행하십시오.

INSERT MyTable DEFAULT VALUES;  --allows no column list. The default will be the IDENTITY
SELECT SCOPE_IDENTITY();

신원이 없다면 설정할 수 있습니까? 이것이 최선의 방법입니다. 위의 SQL을 사용하십시오.

그렇지 않은 경우 새 행을 삽입하려고합니다.

INSERT MyTable (admidid)
OUTPUT INSERTED.admidid --returns result to caller
SELECT ISNULL(MAX(admidid), 0) + 1 FROM MyTable

메모:

  • 높은 부하에서 MAX 솔루션은 중복으로 실패 할 수 있습니다.
  • SCOPE_IDENTITY는 이전이 아니라 사실 이후입니다 .
  • SCOPE_IDENTITY는 IDENTITY 열에서만 작동합니다. IDENT_CURRENT를 사용하여 어떤 멍청함도 그대로
  • 출력 절은 MAX 솔루션의 SCOPE_IDENTITY를 대체합니다.

select 문에 IDENTITY_INSERT를 추가해야합니다.

SET IDENTITY_INSERT MyTable ON

INSERT INTO MyTable
(AdminCol)

SELECT AdminColValue

 FROM Tableb

완료되면 다음 사항을 기억하십시오.

SET IDENTITY_INSERT MyTable OFF

다음은 BOL에서 작동하는 방법에 대한 좋은 설명입니다. http://msdn.microsoft.com/en-us/library/aa259221(SQL.80).aspx


@Phil : 테이블에 자동 증가 PK 열과 AdminName 열이라는 두 개의 열이 있다는 뜻이 아닙니까? AdminName이가는 열이 하나만있는 경우 AdminName은 PK이며 물론 문자열을 자동 증가시킬 수 없습니다. 비즈니스 규칙에서 정규화 된 Windows 사용자 이름을 기본 키로 설정해야합니까? AdminName 열에 대한 대체 고유 인덱스가 필요하지 않기 때문에 실행 가능하고 의미가 있습니다.

그러나 테이블에 하나가 아닌 두 개의 열이있는 경우 :

SQLServer에서 자동 증가는 테이블 / 열 정의의 일부입니다. 열을 정수로 정의한 다음 증분 (일반적으로 1)을 지정하여 ID 열로 만들 수도 있지만 2, 5 또는 10 등이 될 수 있습니다. 행을 삽입하려면 다른 열 값을 삽입하고 PK 열에는 아무 작업도 수행하지 않습니다.

insert into T
(foo)   -- column(s) list
values('bar') -- values list

삽입을 수행하는 저장된 프로시 저는 SCOPE_IDENTITY를 RETURN 값으로 만들거나 SCOPE_IDENTITY를 OUT 매개 변수로 클라이언트에 다시 전달할 수 있습니다.

PS SCOPE_IDENTITY ()는 현재 범위에서 가장 최근에 생성 된 자동 증가 ID 값을 반환합니다. 다음 ID 값을 생성하지 않습니다.

편집하다:

아마도 관리자 테이블에는 관리자 집합이 포함되어 있습니다. 그러나 정수 기본 키 열 이외의 열이없는 경우 관리자를 식별 할 방법이 없습니다. 당신이 할 수있는 유일한 것은 그것들을 서로 구별하는 것입니다. 그것은 당신을 전혀 멀리하지 않습니다. 그러나 관리자 테이블에 다음 구조 중 하나가있는 경우 :

ID   INTEGER PRIMARY KEY AUTOINCREMENT
windowsusername   varchar(50)  (unique index)

또는

windowsusername varchar(50) primary key

다른 테이블에서 관리자 테이블을 참조 할 수 있으며 외래 키는 의미가 있습니다. 이것이 바로 단일 정수 열로 구성된 테이블에없는 의미입니다.

두 개의 열이 있으면 저장 프로 시저가 다음을 수행하도록 할 수 있습니다.

insert into Administrators
(windowsusername)
values('mydomain\someusername');
return SCOPE_IDENTITY();

클라이언트 프로그램은 자동 생성되고 새로 삽입 된 행에 할당 된 자동 증가 ID를 반환 값으로 반환합니다. 이 접근 방식은 일반적인 관행이며 "모범 사례"로 간주됩니다.

P.S. You mention that you didn't know how to "insert a value" if you "didn't have anything to insert". There's a contradiction there. If you have nothing to insert, why insert? Why would you create, say, a new CUSTOMER record if you know absolutely nothing about the customer? Not their name, their city, their phone number, nothing?

참고URL : https://stackoverflow.com/questions/4117676/inserting-rows-into-a-table-with-one-identity-column-only

반응형