一意の制約により新しいレコードをに挿入できない場合の4つの回避策 SQL Server

今すぐ共有:

一意の制約のためにテーブルに新しいレコードを挿入できなかった場合は、この記事をお読みください。 それはあなたがこの問題を解決するのを助けるでしょう。

この記事では、テーブルの一意の制約に違反しているために新しいレコードを挿入できない場合に問題を解決するための4つの方法を紹介します。 SQL Server.

実際のケース:

それでは、実際のケースを見てみましょう。 「Product」という名前のデータベースがあり、「DataNumenデータベース内の「製品」。 テーブルには「ProductId」と「ProductName」のXNUMXつのフィールドがあり、データ型はそれぞれ「int」と「varchar」です。 また、「ProductId」は一意の制約を持つ主キーです。

現在、以下のように、テーブルにいくつかのレコードがあります。表の記録「DataNumen製品"

図1表のレコードDataNumen製品"

データベースにXNUMXつのDBA、つまりジムとトムがあると仮定します。 ある日、ジムは次のようにテーブルの最初のレコードを削除しました。

DELETE FROM DataNumenProduct
WHERE ProductId=1;

XNUMX日目に、トムは次のように、削除されたレコードと同じ主キーを持つ新しいレコードをテーブルに挿入しました。

INSERT INTO DataNumenProduct
VALUES(1,'DataNumen OutLook Repair');

したがって、テーブルには次のようなレコードがあります。

表の更新されたレコードDataNumen製品」

図2表「の更新されたレコード」DataNumen製品」

ジムが削除されたレコードをテーブルに復元したい場合、主キー「ProductId」の一意性制約に違反します。 このような場合、以下の回避策のXNUMXつを使用して問題を解決できます。

回避策1:競合を防ぐために新しいレコードの主キーを変更する

挿入するレコードの主キーを、テーブル内の既存のすべてのレコードの主キーとは異なる新しい値に変更できます。 上記の場合を例にとると、挿入するレコードの場合、主キーの値を1から5に変更できます。次に、以下のように、新しく生成されたレコードをテーブルに復元できます。

INSERT INTO DataNumenProduct VALUES(5, 'DataNumen Access Repair');

以下は、表の最終的なレコードです。表の最終記録「DataNumen 製品」

図3表の最終記録「DataNumen 製品」

回避策2:競合を防ぐために既存のレコードの主キーを変更する

  1. まず、以下のように、競合を引き起こす可能性のある既存のレコードの主キー値を更新する必要があります。
UPDATE DataNumenProduct
SET ProductId = 6
WHERE ProductId = 1;

以下は、表の更新されたレコードです。

表の更新されたレコードDataNumen 製品」

図4表「の更新されたレコード」DataNumen 製品」

  1. 次に、以下のように、削除したレコードをテーブルに復元できます。
INSERT INTO DataNumenProduct
VALUES(1, 'DataNumen Access Repair ');

次に、以下のように最終バージョンを見てみましょう。

表の最終記録「DataNumen 製品」

図5表「の最終記録」DataNumen 製品」

回避策3:SQLを使用して一意制約を一時的に無効にする

  1. この問題を解決するには、以下のようにテーブル内の主キー制約「pk」を一時的に削除すればよい。
ALTER TABLE DataNumenProduct
DROP CONSTRAINT pk;
  1. 次に、以下のように、削除したレコードをテーブルに追加し直すことができます。
INSERT INTO DataNumenProduct
VALUES(1, 'DataNumen Access Repair');

次に、テーブルのレコードを見てみましょう。

表の更新されたレコードDataNumen 製品」

図6表「の更新されたレコード」DataNumen 製品」

  1. 次に、XNUMXつのレコードの主キー値が同じであるため、以下のように、競合を防ぐために一方を変更する必要があります。
UPDATE DataNumenProduct SET ProductId = 5
WHERE ProductName = 'DataNumen Outlook Repair';
  1. 最後に、以下のように、主キー制約「pk」をテーブルに追加し直します。
ALTER TABLE DataNumenProduct
ADD CONSTRAINT pk PRIMARY KEY(ProductId);

これで、以下のように、テーブルにいくつかのレコードがあります。

表の更新されたコンテンツ「DataNumen 製品」

図7表の更新されたコンテンツDataNumen 製品」

回避策 4: 一意制約を一時的に無効にする SQL Server Management Studio:

  1. まず、以下のように、GUIを介してテーブル内の主キー制約「pk」を削除します。

GUIを介して主キー制約「pk」を削除します

図8GUIを介して主キー制約「pk」を削除する

  1. 次に、以下のように、削除されたレコードを実際にテーブルに挿入します。
INSERT INTO DataNumenProduct
VALUES(1, 'DataNumen Access Repair');

これで、以下のように、テーブルにいくつかのレコードがあります。

表「の更新されたコンテンツDataNumen 製品」

図9表「の更新されたコンテンツDataNumen 製品」

  1. 次に、以下のように、テーブル内の既存のレコードの主キー値を変更します。
UPDATE DataNumenProduct
SET ProductId = 5
WHERE ProductName = 'DataNumen Outlook Repair';
  1. 最後に、以下のように、GUIを介して主キー制約「pk」をテーブルに追加し直します。GUIを介して主キー制約「pk」を追加し直します

図8GUIを介して主キー制約「pk」を追加し直す

解決する SQL Server データベースの破損

一意の制約以外に、 SQL Server 腐敗 DBAを悩ませる非常に一般的な問題でもあります。 通常は使用できます SQL Server 破損を解決するための組み込みコマンド。 ただし、それらが機能しない場合は、サードパーティに頼ることができます SQL Server データ復旧ツール。

著者紹介:

Jim Huは、のデータ回復の専門家です。 DataNumen、Inc。は、以下を含むデータ復旧技術の世界的リーダーです。 アクセス修復 (NAIST) と dbf ソフトウェア製品を修理します。 詳細については、次のWebサイトをご覧ください。 WWW。datanumen.com

今すぐ共有:

コメントは締め切りました。