2012-09-19 19 views
46

別のテーブルから外部キーを削除したいので、自分の選択した値を挿入できます。SQL Serverで外部キー制約を削除するにはどうすればよいですか?

私はデータベースで新しくなっていますので、正しいSQLクエリを外して、外来キーの値を削除または削除してください。

+21

データベースに慣れていない場合は、外部キー違反が発生したときに最初に反応して、「外部キーを削除します」と考えるべきではありません。 –

+2

[SQL Serverで外部キーを削除するにはどうすればいいですか?](http://stackoverflow.com/questions/93264/how-do-i-drop-a-foreign-key-in-sql-server) – Liam

答えて

96

てみ次

ALTER TABLE <TABLE_NAME> DROP CONSTRAINT <FOREIGN_KEY_NAME> 

参照してください:http://www.w3schools.com/sql/sql_foreignkey.asp

+1

私は制約名を追加しませんでした。その制約を削除するにはどうすればよいですか? –

+1

制約名を指定しなくても、SQL Serverは一意の制約名を割り当てます。名前はSQL Management Studioで確認できます。 –

+0

もちろん、postgresコマンドラインクライアントで\ d table_nameと入力して、制約の名前を見つけることもできます。通常は "fk ......."のように見える – Nytux

11

それが間違っていたのは、一度その壊れたそれは再びレコードを通過し、制約を破るものを削除することなく、再度オンにすることは容易ではないためです。

次のようにとにかく構文は次のとおりです。

+0

いいえ、外部キーと主キーを削除するSQL Serverの構文は同じです。alter table ドロップ制約 demoncodemonkey

1
ALTER TABLE table 
DROP FOREIGN KEY fk_key 

EDIT:あなたはUSIた気付かなかった

ALTER TABLE Tablename DROP CONSTRAINT ContName; 

は、MSDNを参照してください。 NGのSQLサーバー、私の悪い

ALTER TABLE table 
DROP CONSTRAINT fk_key 
+0

SQL Serverを使用しています。 –

+0

だから気づいた:) – mokuril

4
ALTER TABLE [TableName] DROP CONSTRAINT [CONSTRAINT_NAME] 

しかし、あなたがそれを行うと、あなたが戻ってチャンスを得ることはありませんが、あなたは我々が外部キーを必要とする理由いくつかの基本的なデータベース帳が表示さ読むべき、慎重に男になります

+1

参照整合性がまだ存在する限り、彼はそれを元に戻すことを望むならば、再び制約を追加することができる。とにかくそれは固定されなければならない。 – Tobberoth

+0

@Tobberoth、はい、それは私が意味したこと、それを明確にしてくれてありがとう。現実世界では、ほとんどの場合、他の開発者がテーブル内のデータを混乱させ、それらのデータのために制約を戻すことができません。 –

4

は削除するには、すべてのDBからの制約:

SELECT 'ALTER TABLE ' + Table_Name +' DROP CONSTRAINT ' + Constraint_Name 
FROM Information_Schema.CONSTRAINT_TABLE_USAGE 
0

はすべてFKSを見つけるために、これらのクエリを使用します。

Declare @SchemaName VarChar(200) = 'Schema Name' 
Declare @TableName VarChar(200) = 'Table name' 

-- Find FK in This table. 
SELECT 
    'IF EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N''' + 
     '[' + OBJECT_SCHEMA_NAME(FK.parent_object_id) + '].[' + FK.name + ']' 
     + ''') AND parent_object_id = OBJECT_ID(N''' + 
     '[' + OBJECT_SCHEMA_NAME(FK.parent_object_id) + '].[' 
     + OBJECT_NAME(FK.parent_object_id) + ']' + ''')) ' + 

    'ALTER TABLE ' + OBJECT_SCHEMA_NAME(FK.parent_object_id) + 
    '.[' + OBJECT_NAME(FK.parent_object_id) + 
    '] DROP CONSTRAINT ' + FK.name 
    , S.name , O.name, OBJECT_NAME(FK.parent_object_id) 
FROM sys.foreign_keys AS FK 
INNER JOIN Sys.objects As O 
    ON (O.object_id = FK.parent_object_id) 
INNER JOIN SYS.schemas AS S 
    ON (O.schema_id = S.schema_id) 
WHERE 
     O.name = @TableName 
     And S.name = @SchemaName 


-- Find the FKs in the tables in which this table is used 
    SELECT 
    ' IF EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N''' + 
     '[' + OBJECT_SCHEMA_NAME(FK.parent_object_id) + '].[' + FK.name + ']' 
     + ''') AND parent_object_id = OBJECT_ID(N''' + 
     '[' + OBJECT_SCHEMA_NAME(FK.parent_object_id) + '].[' 
     + OBJECT_NAME(FK.parent_object_id) + ']' + ''')) ' + 

    ' ALTER TABLE ' + OBJECT_SCHEMA_NAME(FK.parent_object_id) + 
    '.[' + OBJECT_NAME(FK.parent_object_id) + 
    '] DROP CONSTRAINT ' + FK.name 
    , S.name , O.name, OBJECT_NAME(FK.parent_object_id) 
FROM sys.foreign_keys AS FK 
INNER JOIN Sys.objects As O 
    ON (O.object_id = FK.referenced_object_id) 
INNER JOIN SYS.schemas AS S 
    ON (O.schema_id = S.schema_id) 
WHERE 
     O.name = @TableName 
     And S.name = @SchemaName 
0

あなたはそれを完全に削除する前に制約を無効にする(一時的に)検討すべきです。制約に違反する値の束を更新/ [挿入...あなたは

ALTER TABLE [dbo].[dbAccounting] NOCHECK CONSTRAINT [FK_some_FK_constraint] 
を実行することができます

ALTER TABLE [dbo].[dbAccounting] CHECK CONSTRAINT [FK_some_FK_constraint] 

:あなたがテーブル作成TSQLを見れば

次のようなものが表示されます元のCHECKステートメントを実行して元の状態に戻します。

(私は過去に継承されてきたクリーンアップ設計が不十分なシステムにこれを実行しなければならなかった。)

-3
alter table <referenced_table_name> drop primary key; 

外部キー制約が削除されます。

+0

参照されているテーブルの主キーを削除することは、おそらく問題を解決する最悪の方法です。ああ待って - 参照されているテーブル自体を削除することが悪い可能性があります。 – brewmanz

0

また、SQL Server Management Studio自体から外部キー制約を削除することもできます。 コマンドが機能しない場合は試してみてください

  1. データベースビューを展開します。
  2. 外部キー制約のあるテーブルを右クリックします。デザインを選択します。表の列に関する情報を含むタブが開きます。
  3. 外部キー参照を持つ列を右クリックします。または、任意の列を右クリックすることもできます。関係を選択します。
  4. ポップアップウィンドウにリレーションシップの一覧が表示されます(ある場合)。
  5. そこから、外部キー制約を削除できます。

私はそれはあなたが構文または他があります使用しているDBによって

0

に役立ちます願っています。

あなたがのOracleを使用している場合あなたは他のユーザーがあなたに言ったものを配置する必要があります:

ALTER TABLE table_name DROP CONSTRAINT fk_name; 

しかし、あなたはMySQLのを使用する場合、これは代わりに、あなたが入力することができ、あなたの構文エラーを与えます:

ALTER TABLE table_name DROP INDEX fk_name; 
1

テーブルのすべての外部キーをドロップ:

USE [Database_Name] 
DECLARE @FOREIGN_KEY_NAME VARCHAR(100) 

DECLARE FOREIGN_KEY_CURSOR CURSOR FOR 
SELECT name FOREIGN_KEY_NAME FROM sys.foreign_keys WHERE parent_object_id = (SELECT object_id FROM sys.objects WHERE name = 'Table_Name' AND TYPE = 'U') 

OPEN FOREIGN_KEY_CURSOR 
---------------------------------------------------------- 
FETCH NEXT FROM FOREIGN_KEY_CURSOR INTO @FOREIGN_KEY_NAME 
WHILE @@FETCH_STATUS = 0 
    BEGIN 
     DECLARE @DROP_COMMAND NVARCHAR(150) = 'ALTER TABLE Table_Name DROP CONSTRAINT' + ' ' + @FOREIGN_KEY_NAME 

     EXECUTE Sp_executesql @DROP_COMMAND 

     FETCH NEXT FROM FOREIGN_KEY_CURSOR INTO @FOREIGN_KEY_NAME 

    END 
----------------------------------------------------------------------------------------------------------------- 
CLOSE FOREIGN_KEY_CURSOR 
DEALLOCATE FOREIGN_KEY_CURSOR 
関連する問題