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