0

現在、Web サイトで PHP と SQL を使用しています。ユーザー (アカウント)、組織、および組織をアカウントにリンクするためのリレーショナル テーブル (多対多の関係) を含むデータベースがあります。

データベースからアカウントを削除すると、削除されるアカウントが組織にリンクされている唯一のアカウントである場合、SQL クエリはアカウントがリンクされている組織も削除する必要があります。

私はSQLに比較的慣れていないため、上記の条件下で組織テーブルから組織を削除するクエリを作成しました。これが私のクエリです:

'DELETE FROM TBL_ORGANISATIONS WHERE id = (
    SELECT org_id FROM TBL_AFFILIATIONS WHERE account_email = :email AND (
        SELECT COUNT(*) FROM TBL_AFFILIATIONS WHERE org_id IN (
            SELECT org_id FROM TBL_AFFILIATIONS WHERE account_email = :email
        )
    ) = 1
)'

これはこのクエリを構成する正しい方法ですか、それともより明確で効率的な方法はありますか? 前に述べたように、私は SQL の初心者であり、このようなクエリ (JOIN など) を構築するのに役立つすべての SQL キーワードの概念をまだ把握していません。

事前にアドバイスをいただければ幸いです。

ところで: 私は PDO を使用しているため、疑問に思っている方のために :email を使用しています。

4

3 に答える 3

0

一度に 2 つのテーブルからデータを削除しようとしているので、これを試すことができます。

DELETE from TBL_ORGANISATIONS TO JOIN TBL_AFFILIATIONS TA 
    ON(TO.id=TA.org_id) where TA.account_email=:email;

ここでは、TBL_ORGANISATIONS と TBL_AFFILIATIONS の 2 つのテーブルから行を削除しようとしています。主キーの TO (つまり id) と外部キーの TA (つまり org_id) を使用し、where 句 where TA.account_email=:email を使用して条件を追加します。

于 2013-10-29T20:38:41.090 に答える
0

私がそうすべきだと思うように、外部キー制約がある場合、このステートメントは失敗します。これは、所属レコードがまだ削除対象の組織レコードを指しているためです。

Mihai が彼の (現在は削除された) コメントで提案したように、組織を削除するために使用できますがON DELETE CASCADE、そのためには、組織にリンクされている所属が 1 つだけかどうかを確認する必要があります。

この場合、まず組織の ID を照会します。削除しようとしているアカウントの詳細がわかるからです。次に、最初にアカウントを削除し、次に必要に応じて組織を削除します。次のようなステートメントを使用します。

DELETE FROM TBL_ORGANISATIONS o
WHERE 
  o.id = :ThatIdYouQueriedBefore AND
  NOT EXISTS (SELECT 'x' FROM TBL_AFFILIATIONS a.org_id = o.id);

個人的に私はカスケード削除の大ファンではありません.一見小さなミスが大量のデータを消費する可能性があるためです.

于 2013-10-29T20:26:45.437 に答える