ID 열이있는 테이블을 만드는 방법


111

ID테이블의 ID 열이되도록 설정된 열로 만들지 않았기 때문에 날려 버릴 기존 테이블이 있습니다.

SQL Server Management Studio를 사용 하여 기존 테이블의 "Create To ..."를 스크립팅하여 다음을 얻었습니다.

CREATE TABLE [dbo].[History](
    [ID] [int] NOT NULL,
    [RequestID] [int] NOT NULL,
    [EmployeeID] [varchar](50) NOT NULL,
    [DateStamp] [datetime] NOT NULL,
 CONSTRAINT [PK_History] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

내 질문은 SQL결과 테이블에 ID열이 Identity 로 설정 되도록 어떻게 수정 합니까?


11
[ID] [int] NOT NULL IDENTITY (1,1)
Li0liQ

답변:


153
CREATE TABLE [dbo].[History](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [RequestID] [int] NOT NULL,
    [EmployeeID] [varchar](50) NOT NULL,
    [DateStamp] [datetime] NOT NULL,
 CONSTRAINT [PK_History] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON)
) ON [PRIMARY]

1
나는 그것이 내가 찾던 것이라고 믿는다. PK_History값을 변경하지 않아도 ID되나요?
jp2code

아니요, PK_History는 기본 키 제약 조건이 이미 열 ID에있는 제약 조건의 이름 일뿐입니다
Gratzy

1
매개 변수 IDENTITY의 의미 (1,1) 무엇인가
OTC


33

이것은 이미 답변되었지만 가장 간단한 구문은 다음과 같습니다.

CREATE TABLE History (
    ID int primary key IDENTITY(1,1) NOT NULL,
    . . .

더 복잡한 제약 인덱스는 실제로 옵션을 변경하려는 경우 유용합니다.

그건 그렇고, 그러한 열의 이름을 HistoryId로 지정하는 것을 선호하므로 외래 키 관계의 열 이름과 일치합니다.


5
OP는 특히 기존 개체에 대한 DDL을 출력하는 GUI 도구의 출력으로 작업합니다. 이 도구에는 "가능하면 더 간단한 구문 사용"옵션이 없을 것입니다. OP의 특정 상황에서 가장 오류가 발생하기 쉬운 것은 생성 된 DDL에서 한 줄을 편집하고 가장 간단한 구문을 사용하여 처음부터 작성하지 않는 것입니다. 또한 당신이 준 예제는 OP와 같이 PK 제약 조건에 이름을 할당하지 않습니다. 많은 사람들이 모든 환경 (dev, test, prod)에서 동일한 이름을 갖도록 명명 된 제약 조건을 선호합니다. ID int constraint PK_History primary key identity(1,1)나는 믿는다.
Shannon Severance

3
그럴 수도 있고 아닐 수도 있고. 한 데이터베이스에서 스크립트를 가져 와서 다른 서버에서 사용했고 한 곳에서 작동하는 기본값이 다른 데이터베이스에 적합하지 않은 상황에 처했습니다. 어쨌든 나는 이것이 나에게 더 간단 해 보이기 때문에 해결책으로 만 제안했다. (나는 개인적으로 제약 조건에 대한 옵션을 이해하는 것보다 "기본 키"키워드를 훨씬 더 잘 이해하고 있으며 "나쁘다"라고 이해하지 않는 옵션을 사용하는 것을 고려한다. "). 그러나 다른 솔루션이 선호되는 이유에 대해 좋은 지적을합니다. 그 대답은 이미 받아 들여진 대답입니다.
Gordon Linoff

@GordonLinoff : 친구, 기본 키는 기본적으로 null이 아닙니다. 여기서 null이 아닌 것을 명시 적으로 지정해야하는 이유는 무엇입니까?
학습자

@Learner. . . 두 제약 모두 OP의 코드에 있습니다. 은 NOT NULL중복입니다.
Gordon Linoff

12
[id] [int] IDENTITY(1,1) NOT NULL,

물론 SQL Server Management Studio에서 테이블을 만들고 있기 때문에 테이블 디자이너를 사용하여 ID 사양을 설정할 수 있습니다.

여기에 이미지 설명 입력


1
글쎄, 필 고마워. 방법을 알고 있지만 테이블이 이미 있기 때문에 할 수 없습니다. 테이블을 삭제하고 다시 만들어야하므로 스크립트를 사용하고 있습니다.
jp2code

4
@ jp2code : ID 열이있는 테스트 테이블을 만든 다음 스크립팅하여 지정 방법을 볼 수 있음을 의미했습니다.
Phil

-2

고유 키는 최대 2 개의 NULL 값을 허용합니다. 설명 :

create table teppp
(
id int identity(1,1) primary key,
name varchar(10 )unique,
addresss varchar(10)
)

insert into teppp ( name,addresss) values ('','address1')
insert into teppp ( name,addresss) values ('NULL','address2')
insert into teppp ( addresss) values ('address3')

select * from teppp
null string , address1
NULL,address2
NULL,address3

아래와 같은 값을 삽입하려고하면 :

insert into teppp ( name,addresss) values ('','address4')
insert into teppp ( name,addresss) values ('NULL','address5')
insert into teppp ( addresss) values ('address6')

매번 다음과 같은 오류가 발생합니다.

UNIQUE KEY 제약 조건 'UQ__teppp__72E12F1B2E1BDC42'위반. 'dbo.teppp'개체에 중복 키를 삽입 할 수 없습니다.
그 진술서는 만료되었습니다.


ID열이 아닌 고유 한 열 을 만들어야했습니다 Name. 열에 고유 제한 조건을 추가 한 이유는 무엇 Name입니까? 그것이 당신의 teppp식탁 에서 어떤 유익을 얻 습니까?
jp2code

1
여기 Q에 대한 모든에 대한 답변
마틴 스미스
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.