30

dbに5つの列があるが、主キーがない列があります。列の1つはmyTable_idという名前で、整数です。

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

私はこれで試しました:

ALTER TABLE Persons
DROP CONSTRAINT pk_PersonID

ALTER TABLE Persons
ADD PRIMARY KEY (P_Id)

ManagementStudioで構文エラーが発生します。

4

5 に答える 5

49

これは、主キーが存在するかどうかを確認し、存在しない場合は作成されます

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

于 2013-02-01T13:22:36.493 に答える
7
ALTER TABLE Persons
ADD CONSTRAINT pk_PersonID PRIMARY KEY (P_Id)
于 2013-02-01T13:13:33.507 に答える
3

IDENTITY制約を既存の列に追加することはできないため、これを追加する方法を最初に考える必要があります。次の 2 つのオプションがあります。

  1. ID を持つ主キーを含む新しいテーブルを作成し、既存のテーブルを削除します
  2. ID を持つ新しい主キー列を作成し、既存の「P_ID」列を削除します

ALTER TABLE...SWITCH3 番目の方法があります。これは、ステートメントを介した非常に大きなテーブルのより良いアプローチです。それぞれの例については、既存の列への の追加IDENTITYを参照してください。この質問への回答として、テーブルが大きすぎない場合は、次を実行することをお勧めします。

-- 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に含めます。SQLPRIMARY KEY作成を参照してください。IDENTITYPRIMARY KEY

于 2015-11-12T14:04:05.797 に答える
0

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

于 2013-02-01T13:25:40.897 に答える