2016-03-29 30 views
2

名前を指定せずに外部キーを作成して、sql serverがそれを自動生成された名前で作成しました。今私はこの外部キーを持つ列を削除したいと思います。問題は、私はこの外部キーの名前を知らないということです。特定のテーブルの特定の列のすべての外部キーを削除する方法はありますか?特定の列の外部キーを削除する方法

は、これまでのところ私は、列

DECLARE @tableName VARCHAR(MAX) 
DECLARE @ConstraintName nvarchar(200) 
DECLARE @columnName VARCHAR(MAX) 

SET @tableName = 'tablename' 
SET @columnName = 'columnname' 
SELECT @ConstraintName = Name 
FROM SYS.DEFAULT_CONSTRAINTS 
WHERE PARENT_OBJECT_ID = OBJECT_ID(@tableName) 
AND PARENT_COLUMN_ID = (
    SELECT column_id FROM sys.columns 
    WHERE NAME = @columnName AND object_id = OBJECT_ID(@tableName)) 
IF @ConstraintName IS NOT NULL 
    BEGIN 
EXEC('ALTER TABLE '[email protected]+' DROP CONSTRAINT ' + @ConstraintName) 
END 

ALTER TABLE [tablename] DROP COLUMN columnname 
GO 

のためのすべてのデフォルトの制約をドロップし、このスクリプトを見つけた。しかし、それは、外部キー制約には役立ちません。

+1

'EXEC sp_help 'TABLE_NAME';'結果セットからFK制約名をコピーし、 'DROP CONSTRAINT'コマンドを使用してそれをドロップしてください! –

答えて

3

FKの詳細や、具体的なスキームやテーブルについて詳しくは、こちらをご覧ください。

SELECT 
    t.Name as TableName, 
    c.name as ColumnName, 
    fk.name as FK_NAME 

FROM sys.foreign_keys as fk 
inner join sys.tables as t on fk.parent_object_id = t.object_id 
inner join sys.columns as c on c.object_id = t.object_id 
inner join sys.schemas as sc on t.schema_id = sc.schema_id 
WHERE sc.name = 'Schema' and t.name = 'Table' and c.name = 'Column' 

あなたが唯一の特定の列について興味を持っている場合は、uがロス押え答えを使用することができます。

Declare @sql nvarchar(4000) 
    SET @sql = N''; 

    SELECT @sql = @sql + ' 
    ALTER TABLE [' + sc.NAME + '].[' + OBJECT_NAME(fk.parent_object_id) + ']' + ' DROP CONSTRAINT ' + '[' + fk.NAME + '] 
    ' 
    FROM sys.foreign_keys as fk 
    inner join sys.tables as t on fk.parent_object_id = t.object_id 
    inner join sys.columns as c on c.object_id = t.object_id 
    inner join sys.schemas as sc on t.schema_id = sc.schema_id 
    WHERE sc.name = 'schemaName' and c.name = 'columnName' -- you can include and fk name 
    ORDER BY fk.NAME 
    PRINT @sql; 
--EXEC sys.sp_executesql @sql; 
0

あなたは列を使用するデータベース全体のすべての制約を見つけることができます:

SELECT * FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE CCU 
WHERE CCU.COLUMN_NAME='someColumn' 

を出力は、制約名と、それが接続されているテーブルを提供します。

2

あなたは以下のクエリの助けを借りて、特定のテーブルに割り当てられた名前と一緒にすべての制約のリストを取得することができます:また、あなたはあなたがこれを実行することができ、すべてのFK制約を削除したい場合は

SELECT * FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
WHERE TABLE_NAME='YourTableName'; 

あなたが削除する制約を見つけたら、クエリ下記の助けを借りてそれを行うことができます。

ALTER TABLE Orders 
DROP CONSTRAINT constraint_name; 
関連する問題