web-dev-qa-db-ja.com

SQL Serverデータベースのスクリプトを使用して主キーを削除する

SQL ServerデータベースのテーブルStudentのプライマリキーを削除する必要があります。

私はテーブルで編集しました、そして私が得たスクリプトは

ALTER TABLE dbo.Student
    DROP CONSTRAINT PK__Student__9CC368536561EF8B

しかし、SQL Serverクエリブラウザーでこのスクリプトを実行して主キーを削除すると

メッセージを表示します

メッセージ3728、レベル16、状態1、行1
'PK__Student__9CC368536561EF8B'は制約ではありません。
メッセージ3727、レベル16、状態0、行1

私の懸念として、PK__Student__9CC368536561EF8Bがランダムに生成されると思いますscriptを使用して主キー制約を削除するのを手伝ってください。

前もって感謝します

41
muthukumar

Sys.key_constraintsテーブルで制約名を検索できます。

SELECT name
FROM   sys.key_constraints
WHERE  [type] = 'PK'
       AND [parent_object_id] = Object_id('dbo.Student');

名前を気にせず、単に削除したい場合は、これと動的SQLの組み合わせを使用できます。

DECLARE @table NVARCHAR(512), @sql NVARCHAR(MAX);

SELECT @table = N'dbo.Student';

SELECT @sql = 'ALTER TABLE ' + @table 
    + ' DROP CONSTRAINT ' + name + ';'
    FROM sys.key_constraints
    WHERE [type] = 'PK'
    AND [parent_object_id] = OBJECT_ID(@table);

EXEC sp_executeSQL @sql;

このコードは、Aaron Bertrandからのものです( source )。

79
Bridge

クリックするだけ

「データベース」>テーブル>テーブル名>キー>「PK__TableName__30242045」などの制約をコピーします

以下のクエリを実行します:

Query:alter Table 'TableName' drop constraint PK__TableName__30242045
13
Harsh Bajaj

私が得た答えは、変数とサブクエリが機能しないため、動的SQLスクリプトを使用する必要があるということです。次の作品:

DECLARE @SQL VARCHAR(4000)
SET @SQL = 'ALTER TABLE dbo.Student DROP CONSTRAINT |ConstraintName| '

SET @SQL = REPLACE(@SQL, '|ConstraintName|', ( SELECT   name
                                               FROM     sysobjects
                                               WHERE    xtype = 'PK'
                                                        AND parent_obj =        OBJECT_ID('Student')))

EXEC (@SQL)
4
muthukumar