2009-05-05 16 views
15

私は、コマンドの下に使用して一つのテーブル作成しました:制約の名前を知らずに外部キーを削除しますか?

create table Table1(
    Id int Not Null 
     Foreign key 
     references Table2(Id) 
     on delete cascade 
     on update cascade, 
    UserName nvarchar(150), 
    TimeInSeconds int Not Null 

    primary key(Id,TimeInSeconds) 
); 

をしかし、今、私は外部キーをドロップします。私は与えられた制約名をhaventは通り 私が使用しカント:

Alter table <tablename> 
drop foreign key <foreign key name> 

は、どのような方法はありますか? Plsヘルプ。

答えて

20

あなたはちょうどあなたがキーのリストを表示し、そこからそれを削除することができます、エンタープライズマネージャ/管理スタジオでテーブルを見ればあなたはINFORMATION_SCHEMA.TABLE_CONSTRAINTS

select CONSTRAINT_NAME 
from INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
where TABLE_NAME = 'Table1' 
+0

+1。クイックドロー。私は行っていました:select * from syscontraints xtype = 'F'、名前は '%table1%'のようになります –

+0

同じスキーマを持つ複数のデータベースにリリースするスクリプトでこれを行うと、この制約は、データベースの各インスタンスごとに異なる可能性がありますか?その場合、これは機能しません。 – Peter

+0

@Peter、理想的には名前付き制約がありますが、そうでない場合でもスクリプト実行時に名前を取得できます。問題はありません。 –

0

に制約の名前を見つけることができます。

-2

あなたが置くことができます:

>ショーテーブルのテーブル名を作成します。

どのようにテーブル...列、タイプ...などを作成したかがわかります。あなたは制約名を見ることができます。

+1

'SHOW CREATE TABLE tablename;はMySQL固有のコマンドです。この質問は、全く異なる製品であるMicrosoft SQL Severに関するものです。 – Raystorm

21

Edの回答に似ていますが、これを使用して、テーブル名と列名に基づいてキー名を選択できます。

このようにスクリプトで実行することも、サブクエリとして実行して制約を破棄することもできます。

SELECT CONSTRAINT_NAME 
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
WHERE TABLE_NAME = 'post' 
AND COLUMN_NAME = 'userID' 
4

私はいくつかの問題に遭遇して以来、答えを拡大しています。また、私は2つの外部キーを宣言していたので、私は維持するために、オプションキーを追加し、それがnullだ場合、それは単に無視されます:

declare @name varchar(255), 
    @table varchar(255) = 'mytable', 
    @column varchar(255) = 'mykeycolumn', 
    @validkey varchar(255) = 'mykeyIwanttokeep' 

SELECT @name = CONSTRAINT_NAME 
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
WHERE TABLE_NAME = @table 
    AND COLUMN_NAME = @column 
    AND (CONSTRAINT_NAME != @validkey or @validkey is null) 

declare @sql varchar(1023) = 'alter table ' + @table + ' drop ' + @name 

exec (@sql) 
+1

AND COLUMN_NAME = ** @列** –

+0

ありがとうございました。 – SumGuy

+0

それに加えて、質問全体に答えるためのものです。他の人はSQL Serverがパラメータ化することを許可していない実際のドロップの部分を見逃していました。 –

1

SQL Serverのオプション:

DECLARE @foreignkey varchar(100) 
DECLARE @tablename varchar(100) 
DECLARE @command nvarchar(1000) 

DECLARE db_cursor CURSOR FOR 
SELECT fk.name, t.name 
FROM sys.foreign_keys fk 
JOIN sys.tables t ON t.object_id = fk.parent_object_id 
WHERE t.name IN (
    'table_1_name_here', 
    'table_2_name_here' 
) 

OPEN db_cursor 
FETCH NEXT FROM db_cursor INTO @foreignkey, @tablename 
WHILE @@FETCH_STATUS = 0 
BEGIN 
    SELECT @command = 'ALTER TABLE ' + @tablename + ' DROP CONSTRAINT ' + @foreignkey 
    EXECUTE(@command) 
    FETCH NEXT FROM db_cursor INTO @foreignkey, @tablename 
END 
CLOSE db_cursor 
DEALLOCATE db_cursor 

SQLの選択あなたが気にするテーブルのすべての制約をカーソルに入れ、それらを1つずつ削除します。あなたが知る必要があるのは、それらを削除したいテーブルの名前だけです。

関連する問題