我想在一个查询中删除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
答案 0 :(得分:5)
你正在考虑以错误的方式进行级联。您当前的外键约束所说的是"当您删除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
中的所有相关行都将被自动删除。
你提到的问题是相反的,不会发生。