2013-02-01 2 views
24

데이터베이스에 5 개의 열만 있지만 기본 키는없는 열이 있습니다. 열 중 하나의 이름은 myTable_id이며 정수입니다.테이블에 기본 키가 없으면 열을 기본 키로 설정하십시오.

테이블에 기본 키 열이 있는지 확인하고 싶습니다. 그렇지 않으면 myTable_id를 기본 키 열로 만들어 ID 열로 만듭니다. 이것을 할 수있는 방법이 있습니까?

ALTER TABLE Persons 
DROP CONSTRAINT pk_PersonID 

ALTER TABLE Persons 
ADD PRIMARY KEY (P_Id) 

을 내가 관리 스튜디오에서 구문 오류가 발생합니다 :

나는이 함께했습니다.

+3

귀하는 하나의 대답을 수락 된 것으로 표시해야합니다. –

답변

9
ALTER TABLE Persons 
ADD CONSTRAINT pk_PersonID PRIMARY KEY (P_Id) 
+1

ID 열은 어떻습니까? –

+0

"테이블에 기본 키 열이 있는지 확인하고 싶습니다."라는 메시지가 표시되지 않았습니다. – Monkey

43

기본 키가있는 경우가

IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
WHERE CONSTRAINT_TYPE = 'PRIMARY KEY' AND TABLE_NAME = 'Persons' 
AND TABLE_SCHEMA ='dbo') 
BEGIN 
    ALTER TABLE Persons ADD CONSTRAINT pk_PersonID PRIMARY KEY (P_Id) 
END 
ELSE 
BEGIN 
    -- Key exists 
END 

를 작성하지 않을 경우이, 검사는 바이올린 : http://sqlfiddle.com/#!6/e165d/2

0

나는 당신이 할 수 있다고 생각하지 않습니다. 컬럼을 식별 컬럼으로 만들려면 테이블을 완전히 삭제해야한다고 생각합니다.

+1

ID로 변환 할 수는 없지만 테이블에 ID를 추가 할 수 있습니다. – Paparazzi

2

OBJECTPROPERTY Transact SQL을 사용하여 기본 키가 존재하는지 여부를 확인할 수 있습니다. 두 번째 인수에는 'TableHasPrimaryKey'을 사용하십시오.

DECLARE @ISHASPRIMARYKEY INT; 

SELECT @ISHASPRIMARYKEY = OBJECTPROPERTY(OBJECT_ID('PERSONS'), 'TABLEHASPRIMARYKEY'); 
IF @ISHASPRIMARYKEY IS NULL 
BEGIN 
    -- generate identity column 
    ALTER TABLE PERSONS 
    DROP COLUMN P_ID; 

    ALTER TABLE PERSONS 
    ADD P_ID INT IDENTITY(1,1); 

    -- add primary key 
    ALTER TABLE PERSONS 
    ADD CONSTRAINT PK_PERSONID PRIMARY KEY (P_ID); 

END; 
+1

@ISHASPRIMARYKEY는 Persons 테이블이 없으면 null이 될 것이라고 생각합니다. 그렇지 않으면 기본 키의 존재 여부에 따라 0 또는 1이됩니다. . – KnarfaLingus

+0

@KnarfaLingus - 정확합니다. 나는 편집을 만들었지 만 내 담당자가이 시점에서 충분히 높지 않아 승인을 기다려야합니다. –

2

IDENTITY 제약 은 그래서 당신이 추가하는 방법이 초기 생각을 할 필요가, 기존의 열에 추가 할 수 없습니다. 두 가지 옵션이 있습니다 :

  1. 기존 'P_ID'열을 정체성과 기본 키를 포함하여 새 테이블을 만들고 기존 테이블을
  2. 드롭 정체성을 가진 새로운 기본 키 열을 만들고 드롭

세 번째 방법은 ALTER TABLE...SWITCH 문을 통해 매우 큰 테이블에 대한 더 나은 접근 방법입니다. 각각의 예제는 Adding an IDENTITY to an existing column을 참조하십시오.

-- Check that the table/column exist and no primary key is already on the table. 
IF COL_LENGTH('PERSONS','P_ID') IS NOT NULL 
    AND NOT EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
        WHERE CONSTRAINT_TYPE = 'PRIMARY KEY' AND TABLE_NAME = 'PERSONS') 
        -- Add table schema to the WHERE clause above e.g. AND TABLE_SCHEMA ='dbo' 
BEGIN 
    ALTER TABLE PERSONS  
    ADD P_ID_new int IDENTITY(1, 1) 
    GO 

    ALTER TABLE PERSONS 
    DROP COLUMN P_ID 
    GO 

    EXEC sp_rename 'PERSONS.P_ID_new', 'P_ID', 'Column' 
    GO 

    ALTER TABLE PERSONS 
    ADD CONSTRAINT PK_P_ID PRIMARY KEY CLUSTERED (P_ID) 
    GO 
END 

참고 : 테이블이 너무 크지 않은 경우는이 질문에 대한 대답에서, 나는 다음을 실행하는 것이 좋습니다 을 명시 적으로 CONSTRAINT 키워드를 기본 키 제약 조건을 사용하여 특정 이름보다는 주어집니다 SQL Server에 따라 이름을 자동으로 할당 할 수 있습니다.

CLUSTERED에만 특정 P_ID 및 쓰기 양에 대한 검색 균형이 다른 색인에 의한 테이블 클러스터링의 이점을 초과하는 경우 에 포함하십시오. Create SQL IDENTITY as PRIMARY KEY을 참조하십시오.

관련 문제