2017-08-08 101 views
0

我有两个表:Unidirectionnel关系:删除级联

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

当您从子(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