1

私は2つのテーブルを持っています:AそしてB

A次の列が含まれます。

Id [uniqueIdentifier] -PK
checkpointId [numeric(20,0)]

B以下が含まれます。

Id [uniqueIdentifier] – PK
A_id (FK, uniqueIdentifier)

BAfrom列への参照がありA_idます (FK)

A質問: テーブルからcheckpoint_id以下のすべてのレコードを削除したいX:

delete from CheckpointStorageObject where checkpointIdentifierIdentifier <= 1000

でもそれ以来できない"The primary key value cannot be deleted because references to this key still exist"

B結合せずにテーブルから最初に削除しようとしました:

DELETE FROM CheckpointToProtectionGroup 
WHERE EXIST (SELECT * from CheckpointStorageObject 
             WHERE CheckpointStorageObject.CheckpointIdentifierIdentifier <= 1000)

しかし、うまくいきませんでした。

どうすればいいですか?1 つの実行コマンドで両方のテーブルから削除することは可能ですか?

その結果、削除されたレコードは非常に大きくなる可能性があります (各テーブルに 30,000 を超えるレコード)。

4

3 に答える 3

3

これを試して:

最初に tableB から削除します。

delete from tableB where A_id IN (Select Id from tableA where checkpointId <= 1000)

次に、tableA から削除します。

delete from tableA where checkpointId <= 1000
于 2012-08-07T13:08:27.500 に答える
1

まず、テーブル B からエントリを削除する必要があります

delete from tableB where A_id IN (Select Id from tableA where checkpointIdentifierIdentifier <= 1000)

それが完了したら、テーブル B に存在しなくなった ID を確認して、テーブル A から削除できます。

delete from tableA where Id not in (select A_id from tableB)
于 2012-08-07T13:13:37.593 に答える
1

2 番目のクエリにはいくつかの欠陥があります。

  • それEXISTSはそうではないEXIST

  • 2 つのテーブル間の結合条件を指定する必要があります。このような相関サブクエリでは、この scondition をWHERE句に追加します

  • また、コードを減らして読みやすくするために、特にそのような長い名前の場合は、テーブルにエイリアスを設定することも有用です。

  • 2 つのステートメントをトランザクションに含めて、トランザクションが成功して両方のテーブルから削除されるか、失敗して何も削除されないかを確認します。トランザクションを使用しない場合、2 回目の削除の間に短い時間で行がテーブル B に挿入され、2 回目のステートメントが削除しようとするテーブル A の行を参照している場合、2 回目の削除は成功しない可能性があります。 .

したがって、最初にテーブル B ( CheckpointToProtectionGroup)から削除します。

BEGIN TRANSACTION

    DELETE FROM CheckpointToProtectionGroup AS b
    WHERE EXISTS                                  --- EXISTS
          ( SELECT * 
            FROM CheckpointStorageObject AS a
            WHERE a.id = b.A_id                   --- join condition
              AND a.CheckpointId <= 1000
          ) ;

次に、テーブル A ( CheckpointStorageObject) から:

    DELETE FROM CheckpointStorageObject
    WHERE CheckpointId <= 1000 ;

COMMIT TRANSACTION ;
于 2012-08-07T13:37:57.850 に答える