为什么ON CASCADE DELETE不起作用?

时间:2018-06-08 09:17:40

标签: mysql sql

我想在一个查询中删除2个表中的行,所以我这样做:

DELETE FROM form_questionnaire;

这是从form_questionnaire删除所有行,但在questionnaire中留下行。如果questionnaire中有ON DELETE CASCADE,为什么form_questionnaire.questionnaire_id中的行未被删除?

我的表格

CREATE TABLE questionnaire(
    id INTEGER AUTO_INCREMENT PRIMARY KEY NOT NULL,
    content JSON,
    creator VARCHAR(50) NOT NULL,
    created TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE form_questionnaire(
    form_id INTEGER,
    questionnaire_id INTEGER,
    FOREIGN KEY(form_id) REFERENCES form(id),
    FOREIGN KEY(questionnaire_id) REFERENCES questionnaire(id) ON DELETE CASCADE
) ENGINE=INNODB;

数据库服务器

MySQL 5.7.21-20

2 个答案:

答案 0 :(得分:5)

你正在考虑以错误的方式进行级联。您当前的外键约束所说的是&#34;当您删除import java.time.LocalTime; import java.time.LocalDate; import java.time.Duration; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; public class MyClass { public static void main(String args[]) { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy.MM.dd HH:mm:ss"); LocalTime timeStart = LocalTime.parse("00:00:00"); LocalTime timeStop = LocalTime.parse("12:05:00"); LocalDateTime dateTime1 = LocalDateTime.of(LocalDate.now(), timeStart); LocalDateTime dateTime2 = LocalDateTime.of(LocalDate.now(), timeStop); executeDifference(dateTime1, dateTime2); LocalTime timeStart2 = LocalTime.parse("12:05:00"); LocalTime timeStop2 = LocalTime.parse("00:00:00"); LocalDateTime dateTime3 = LocalDateTime.of(LocalDate.now(), timeStart2); LocalDateTime dateTime4 = LocalDateTime.of(LocalDate.now().plusDays(1), timeStop2); executeDifference(dateTime3, dateTime4); } private static void executeDifference(LocalDateTime timeStart, LocalDateTime timeStop) { Duration duration = Duration.between(timeStart, timeStop); durationOutput(duration); } private static void durationOutput(Duration duration) { long hours = duration.toHours(); long minutes = duration.toMinutes() - (hours * 60); long seconds = duration.getSeconds() - (hours * 3600) - (minutes * 60); System.out.println(timeUnitsOutput(hours) + ":" + timeUnitsOutput(minutes) + ":" + timeUnitsOutput(seconds)); } private static String timeUnitsOutput(long units) { return (units < 10) ? ("0" + units) : String.valueOf(units); } } 中的任何行时,还要删除表(questionnaire)中的所有行引用那些行&#34;。这就是级联。

答案 1 :(得分:3)

我不确定我是否理解这个错误,或者这是你的打字错误。如果删除了主表中的相关行,则外键将删除CHILD表中的所有行(其中定义了FOREIGN KEY)。

也就是说,如果从questionnaire表中删除行,由于CASCADE DELETE,form_questionnaire中的所有相关行都将被自动删除。

你提到的问题是相反的,不会发生。