我正在尝试从问题表和关系表中删除与测验 id 匹配的所有记录。该查询适用于 select 语句,但不允许删除相同的语句。
@quizId
是我传递到存储过程中的测验 Id 值。有谁知道如何使用一个语句从两个表中删除?是否可以?
DELETE tGeoQuestions as a, tGeoQuizToQuestion as b WHERE b.quizId = @quizId AND a.id = b.questionid
我正在尝试从问题表和关系表中删除与测验 id 匹配的所有记录。该查询适用于 select 语句,但不允许删除相同的语句。
@quizId
是我传递到存储过程中的测验 Id 值。有谁知道如何使用一个语句从两个表中删除?是否可以?
DELETE tGeoQuestions as a, tGeoQuizToQuestion as b WHERE b.quizId = @quizId AND a.id = b.questionid
您需要启用级联删除然后它会自动发生,您需要做的就是从带有PK的表中删除所有fk表将被自动删除
否则是两步操作
像这样的东西,把它放在一个 tran
DELETE a
FROM tGeoQuestions as a
JOIN tGeoQuizToQuestion as b
ON a.id = b.questionid
AND b.quizId = @quizId
DELETE tGeoQuizToQuestion WHERE quizId = @quizId
您的第三个选项是 PK 表上的触发器,如果它在 PK 表中被删除,它会从 FK 表中删除所有内容......我不推荐触发器
试试这个:
DELETE a
FROM tGeoQuestions as a
INNER JOIN tGeoQuizToQuestion as b ON a.id = b.questionid
WHERE b.quizId = @quizId
顺便说一句,您的 select 语句确实有效(我不知道您的语句是什么......)。
您只能更换
SELECT ...
和
DELETE [table name or alias]
并保持其他一切不变。
我不确定是否可以从同一个语句中的两个表中删除,就像你可以从两个表中选择一样。至少在 Oracle 中是不可能的。
正如 SQLMenace 提到的,最好的选择是打开级联。
但是要小心 Cascade,如果你的结构中根深蒂固,那么很容易清除大量数据。
据我所知,这在单个 SQL 语句中是不可能的。如果您有正确的关系设置,删除将自动级联。否则,您将不得不发出 2 个删除语句。
您可以在 mysql delete手册中执行此操作,该方法显示为
DELETE [LOW_PRIORITY] [QUICK] [IGNORE]
tbl_name[.*] [, tbl_name[.*] ...]
FROM table_references
[WHERE where_definition]
在 SQL Server 中,我认为您需要使用外键或从 quiz = ... 的问题中删除,然后从测验表中删除