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


83

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

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

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


1
명확히하기 위해 "단일 IDENTITY 열이있는 SQL Server 테이블에 행을 삽입하는 방법"이 질문입니까?
gbn

예, 맞습니다. 명확히 해주셔서 감사합니다
Phil

2
여기에 착륙하는 사람들의 경우 이전에이 질문을 받았으며 정답은 다음과 같습니다. stackoverflow.com/questions/850327/…
BJury

답변:


140

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를 대체합니다.

1

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


나는 다음과 같이해야합니까 : SET IDENTITY_INSERT Administrator ON INSERT INTO Administrator (SCOPE_IDENTITY ()) SET IDENTITY_INSERT Administrator OFF?
Phil

예. 그게 당신이해야 할 전부입니다. SET ON, 코드 작성, SET OFF 끝.
DataWriter

나는 이것이 정답이라고 생각하지 않습니다. ID 열인 경우 값을 추가해서는 안됩니다. 받아 들여진 대답은 정답입니다.
Mmm

0

@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를 반환 값으로 반환합니다. 이 접근 방식은 일반적인 관행이며 "모범 사례"로 간주됩니다.

추신 : "삽입 할 것이없는 경우" "값을 삽입"하는 방법을 몰랐다고 말씀하셨습니다. 거기에 모순이 있습니다. 삽입 할 것이 없는데 왜 삽입합니까? 고객에 대해 전혀 모르는데 왜 새로운 CUSTOMER 레코드를 생성하겠습니까? 이름도, 도시도, 전화 번호도 아니 고요?


2
내 테이블에는 증분 정수 값인 adminId라는 하나의 열이 있습니다.
Phil

이것이 제가 본 것 중 가장 이상한 디자인이고, 저는 20 년 넘게 사업에 종사해 왔으며 제 시대에 이상한 것들을 보았습니다. 따라서 귀하의 질문은, 테이블에 해당 PK 열과 해당 PK 열만 있고 다른 열은없는 경우 자동 증가 식별 열로 정의 된 기본 키 열만 포함 된 테이블에 어떻게 삽입합니까?
Tim

그래서 반대표는 무엇입니까? 어딘가에있는 사실적인 오류 또는 디자인의 장점 부족에 대한 의견을 표명 한 것입니까?
Tim

1
DB 설계의 이유를 명확히하기 위해서입니다. 하나의 테이블에 사용자가 있습니다. 사용자와 관리자 사이에 관계가있는 경우 관리자로 취급됩니다. 실제 고유 ID보다 관리 테이블에 보관할 항목이 더 없습니다. "실제"데이터는 사용자 테이블과 has-relation (타임 스탬프 및 권한 부 여자 등)에 있습니다.

1
@Phil : 따라서 간단한 부울 / 비트 열이 할 수있는 작업을 표현하기 위해 테이블과 외래 키 관계를 사용하고 있습니다. 이러한 비트 열을 테이블에 추가 할 수 없으며 몇 가지 해결 방법을 찾아야합니다. But an autoincrementing integer whose autoincrementation must be disabled is a poor solution.사용자 테이블과 일대일 관계가있는 병렬 테이블 만 있으면 해당 테이블에서 비트 열을 만듭니다. 해당 열이 true이면 사용자 has-admin을 의미합니다. 깨끗한. 표준. 디자인.
Tim
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.