我有两张桌子:
CREATE TABLE IF NOT EXISTS `DB`.`global_history` (
`ID` INT(11) AUTO_INCREMENT,
`ID_HISTORY` INT(11) NULL,
PRIMARY KEY (`ID`),
CONSTRAINT `FK_HISTORY_GLOBAL_HISTORY`
FOREIGN KEY (`ID_HISTORY`)
REFERENCES `DB`.`history` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
第二张表:
CREATE TABLE IF NOT EXISTS `DB`.`history` (
`ID` INT(11) AUTO_INCREMENT,
`TIMESTAMP` DATETIME NOT NULL,
PRIMARY KEY (`ID`));
但是当我尝试删除历史记录(第二个表)中的一行时,我收到此错误:
- >无法删除或更新父行:外键约束失败
我希望关系为@ManyToOne
因此,当我从global_history
删除一行时,它不会删除history
中的任何行
这是我的模特课:
全球历史:
@ManyToOne
@JoinColumn(name = "ID_HISTORY", nullable = true)
private History history;
- >历史是一个简单的类
答案 0 :(得分:0)
看看Hibernate property annotations。您必须设置级联类型。
@Cascade(CascadeType.DELETE)
应该有效
答案 1 :(得分:0)
当您从子(global_history)到父(历史表)定义F.K时,子表不能具有无效的F.K.所以你应该决定删除导致F.K无效的父母。 具有级联删除的外键意味着如果删除父表中的记录,则将自动删除子表中的相应记录。这在SQL Server中称为级联删除。
因此,如果要阻止删除相应的子行,可以使用以下命令设置空值或默认值:
ON DELETE SET NULL
ON DELETE SET DEFAULT
这是完整的格式:
CREATE TABLE child_table
(
column1 datatype [ NULL | NOT NULL ],
column2 datatype [ NULL | NOT NULL ],
...
CONSTRAINT fk_name
FOREIGN KEY (child_col1, child_col2, ... child_col_n)
REFERENCES parent_table (parent_col1, parent_col2, ... parent_col_n)
ON DELETE CASCADE
[ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
)
https://www.techonthenet.com/sql_server/foreign_keys/foreign_delete.php