2013-02-01 15 views
24

5列ありますが主キーなしの列があります。 列の1つはmyTable_idという名前で整数です。テーブルに主キーがない場合は、主キーとして列を設定します。

テーブルに主キー列があるかどうかをチェックしたいと思います。そうでない場合は、myTable_idを主キー列にしてID列にします。これを行う方法はありますか?

私はこれを試してみました:

ALTER TABLE Persons 
DROP CONSTRAINT pk_PersonID 

ALTER TABLE Persons 
ADD PRIMARY KEY (P_Id) 

と私は管理のスタジオで構文エラーが発生します。

+3

あなたは1つの回答に合格とマークする必要があります。 –

答えて

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

を私はあなたがそれを行うことができるとは思いません。列をID列にするためには、テーブルを完全に削除する必要があると思います。

+1

IDに変換することはできませんが、IDをテーブルに追加することができます – Paparazzi

2

OBJECTPROPERTY Transact SQLを使用して、主キーが存在するかどうかを確認するには、2番目の引数に'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制約はあなたが追加どのようにこれはあなたの最初の思想である必要があり、既存の列に追加することはできません。 2つのオプションがあります。

  1. は、既存の「P_ID」列を識別して、主キーを含む新しいテーブルを作成し、既存のテーブルに
  2. をドロップアイデンティティを持つ新しい主キー列を作成し、ドロップ

第3の方法があります。これは、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に依存します。

には、特定のP_IDに対する検索のバランスと書き込み量が他のインデックスによってテーブルをクラスタリングする利点を上回る場合にのみ、CLUSTEREDが含まれます。 Create SQL IDENTITY as PRIMARY KEYを参照してください。

関連する問題