2

SQL データ ソースを利用したグリッド ビューがあります。グリッドビューの削除コマンドを使用してレコードを削除したいのですが、問題は、単一のレコードが複数のテーブルから収集された情報に基づいているため、レコードを完全に削除するには、これらすべてのテーブルから情報の一部を削除する必要があることです。テーブル構造。

  1. プロジェクト
  2. プロジェクト記事
  3. 記事のステータス
  4. プロジェクトの割り当て

プロジェクトは、プロジェクトのタイトル、クライアント名などのプロジェクトに関する完全な情報を含むテーブルで、主キー「project_id」があります

ProjectArticles は、1 つのプロジェクトに関連付けられている記事の数に関する情報を含むテーブルです。たとえば、プロジェクトに 3 つの記事がある場合、このテーブルには次のデータを含む 3 つの行があります。

article_id  project_id

1 --------- 1 
2 --------- 1 
3 --------- 1 

ここで、「article_id」は主キーです。

記事のステータスは、次のような 1 つの記事に関する情報を含むテーブルです。

status_id- article_id- filename ---- writer_status- editor_status- sales_status

1 -------- 1 --------- Any filename -- done --------- pending ------ pending

「status_id」は主キーです

最後に、ProjectAssignments は、どのプロジェクトがどのライターに割り当てられているかに関するデータを含むテーブルで、assignment_id を主キーとして持ち、project_id を外部キーとして使用します (上記と同様)。

他のテーブルに関連するすべての情報を含む完全なプロジェクトを削除するにはどうすればよいですか?

このサンプルクエリを作成しましたが、機能していません.SQL管理スタジオは「クエリテキストを解析できません」と言っています.

DELETE P, A FROM Projects AS P, ProjectArticles AS A WHERE P.project_id = A.project_id AND P.project_id = @project_id

上記のクエリ テキストでは、2 つのテーブルを使用して機能しているかどうかを確認しましたが、機能していません。

4

3 に答える 3

0

まず、何を削除したいのか知りたいです。

(1) 単一の [プロジェクト] テーブルのすべての詳細を削除しますか。はいの場合、それは大きな問題ではありません。なぜなら、あなたはすでに主キーと外部キーを維持していると思うからです削除されます。

(2) 前述のように単一のステータスを削除する場合

" 記事のステータスは、次のような 1 つの記事に関する情報を含むテーブルです。

status_id- article_id- ファイル名 ---- writer_status- editor_status- sales_status

1 -------- 1 --------- 任意のファイル名 -- 完了 --------- 保留中 ------ 保留中 "

次に、「ArticleStatus」のテーブル行を 1 つ削除するだけです。

「ON CASCADE DELETE」について知りたい場合は教えてください

于 2011-05-14T04:20:38.497 に答える
0

カスケードは、Referenctial テーブルで外部キーとして使用されている特定の主キーに関連するすべての行を削除する場合に役立ちます。

例 :- プライマリ テーブルまたは親テーブル Tab1(Id int (主キー) ,Name varchar(10)) 子テーブル Tab2(Class int, Id int (Tab1 の参照キー(Id),address varchar(10))

レコードから1つの番号IDを削除する場合は、「ON DELETE CASCADE」が最適ですが、子テーブルのレコードを1つだけ削除する場合は、トランザクションが適切です。

于 2011-05-16T04:55:45.900 に答える
0

これを攻撃する方法はいくつかあります。

SQL サーバーで制約を宣言し、Cascade をオンに設定できます。使用しているSQLサーバーに応じて削除するDelete from P where condition Cascadeと、SQLサーバーに削除するように指示し、すべての参照に従ってこの削除をカスケードします。

多くの場合、すべてがメモリ内にある場合は DAL でそのような条件を設定できますが、サポートされている場合は DAL でカスケードを設定します。リスクは、コンカレンシーの問題と、メモリ内のすべての可能な参照データをロードしてから、それが成功することを最終的に知る前に問題が発生することです。

カスケードは通常オフになっていることに注意してください。多くの人は、条件をトランザクションとして順番に使用して削除する最終的なクエリを作成することを好みます。

Begin Transaction
    Delete from Tables_Child where ID in (--your query)
    Delete from Tables_Child2 where ID in (--your query)
    (your_Query)
Commit Transaction

そうすれば、何が起きようとしているのかを知ることができ、循環に陥ることなくそれを制御できます。

于 2011-05-13T08:24:41.603 に答える