web-dev-qa-db-ja.com

SQLサーバーの外部キー制約を削除するにはどうすればよいですか?

別のテーブルから外部キーを削除して、選択した値を挿入できるようにします。

私はデータベースが初めてなので、外部キー値を削除または削除するための正しいSQLクエリを教えてください。

60
Ammar Asjad

フォローしてみてください

ALTER TABLE <TABLE_NAME> DROP CONSTRAINT <FOREIGN_KEY_NAME>

参照: http://www.w3schools.com/sql/sql_foreignkey.asp

122
Prasanna

参照整合性 を参照するのは間違っています。一度壊れると、レコードを調べて制約を破るレコードを削除することなく再びオンにするのは簡単ではないからです。

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

ALTER TABLE Tablename DROP CONSTRAINT ContName;

MSDNを参照してください。

11
CloudyMarble
ALTER TABLE [TableName] DROP CONSTRAINT [CONSTRAINT_NAME]

しかし、気をつけてください、あなたがそれをしたら、あなたは決してチャンスを取り戻せないかもしれません、そしてあなたはいくつかの基本的なデータベースの本を読んで、なぜ私たちが外部キーを必要とするのかを見てください

4
Simon Wang

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

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

DBに応じて、構文などがあります。

Oracleを使用している場合、他のユーザーが言ったことを入力する必要があります。

ALTER TABLE table_name DROP CONSTRAINT fk_name;

ただし、MySQLを使用すると、構文エラーが発生し、代わりに次のように入力できます。

ALTER TABLE table_name DROP INDEX fk_name;
2
Guim Gonzalez
ALTER TABLE table
DROP FOREIGN KEY fk_key

編集:あなたがSQLサーバーを使用していることに気づかなかった、私の悪い

ALTER TABLE table
DROP CONSTRAINT fk_key
1
mokuril

完全に削除する前に、制約を(一時的に)無効にすることを検討する必要があります。

テーブル作成TSQLを見ると、次のようなものが表示されます。

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

走れます

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

...次に、制約に違反する値の束を挿入/更新してから、元のCHECKステートメントを実行して、再び有効にします。

(過去に引き継いだ設計が不十分なシステムをクリーンアップするには、これを行わなければなりませんでした。)

1
feetwet

テーブルのすべての外部キーを削除します。

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
1
Ashraf

これらのクエリを使用して、すべてのFKを検索します。

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

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

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

それがお役に立てば幸いです

0
alchi baucha