4

わかりました、これは (おそらく)非常に単純な質問ですが、残念ながら私は MySQL をほとんど知らないので、我慢してください。別のテーブルの外部キーによって制約されていないテーブルからすべての行を削除しようとしています-特定のテーブル、ここには2つのテーブルしかありません。create ステートメントは次のようになります。

CREATE TABLE  `testschema`.`job` (
  `Job_Id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `Comment` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`Job_Id`) USING BTREE,
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

CREATE TABLE  `ermieimporttest`.`jobassignment` (
  `JobAssignment_Id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `JobId` int(10) unsigned DEFAULT NULL,
  PRIMARY KEY (`JobAssignment_Id`),
  KEY `FK_jobassignment_1` (`JobId`),
  CONSTRAINT `FK_jobassignment_1` FOREIGN KEY (`JobId`) REFERENCES `job` (`Job_Id`),
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

私のSQL文は次のとおりです。

DELETE FROM job USING job INNER JOIN jobAssignment WHERE job.Job_Id != jobAssignment.JobId;

これは正しいと思いました。外部キーとしてそのジョブを持つジョブ割り当てが存在しないジョブ テーブルからすべてのジョブを削除する必要があります。ただし、これを実行しようとすると、次のエラーで失敗します。

親行を削除または更新できません: 外部キー制約が失敗しました ( testdatabase. jobassignment, CONSTRAINT FK_jobassignment_1 FOREIGN KEY ( JobId) REFERENCES job ( Job_Id))

それで、私が間違っている愚かなことは何ですか?

編集: いつものように、ここに投稿してから数秒後に答えが見つかりました。私は(完全に異なる)クエリを使用しました:

DELETE FROM job WHERE Job_Id NOT IN (SELECT JobId FROM jobassignment) 

好奇心から、これはそれを行うためのより良い方法ですか?私の最初のアイデアは実現可能でしたか? もしそうなら、それの何が問題だったのですか?

4

3 に答える 3

7
DELETE FROM job USING job 
LEFT JOIN jobAssignment ON(job.Job_Id = jobAssignment.JobId)
WHERE jobAssignment.JobId IS NULL;
于 2010-07-02T10:24:05.553 に答える
5

おそらくサブクエリが必要になるでしょう。これが mySQL で機能するかどうかはわかりませんが、少なくとも同様のものが必要です。

DELETE FROM job
WHERE job.Job_Id NOT IN (
  SELECT JobId FROM jobAssignment
)
于 2010-07-02T10:24:25.647 に答える
1

ナクティバルダは、サブクエリが非効率的である可能性があることを示唆しています。もしそうなら、あなたは試すことができます

DELETE FROM job
     WHERE NOT EXISTS (SELECT *
                           FROM jobassignment
                           WHERE job.Job_Id = jobassignment.Job_Id);

私は過去に IN と NOT IN で悪い経験をしました。NOT EXISTS のトラブルが少ない。

于 2010-07-02T10:38:24.580 に答える