[英]Java Spring boot hibernate delete cascade data
我在從數據庫中正確刪除數據時遇到問題。 我在 Spring Boot 應用程序中使用了 Hibernate orm,現在是我想從數據庫中刪除用戶的時刻。 但是有現實,有些表包含父表用戶的外鍵。 如何刪除所有鏈接的數據在哪里外鍵? 這是我的所有表:以及帶鍵的列的名稱:
- User - id
- Workers - id(fk)
- Resetkeys - userId(fk)
- UserRole - userId(fk)
- Tokens - userId(fk)
以及如何刪除所有這些數據的用戶? 感謝您的幫助!
您是否在模型中使用了關系注釋? 像這樣,
@OneToMany(cascade = CascadeType.REMOVE )
請參閱規范https://docs.oracle.com/cd/E19798-01/821-1841/bnbqm/index.html
(已編輯)
無需參考 Spring 或 Hibernate 等框架,您可以簡單地設置數據庫表,並對外鍵列進行約束,以便在刪除“用戶”記錄時刪除所有相關記錄。 該約束稱為ON DELETE CASCADE
,如果您在連接表的外鍵列上定義它,RDBMS 將自動刪除外鍵與已刪除記錄的選定用戶 ID 匹配的所有記錄。
嘗試針對您正在使用的數據庫服務器的ON DELETE CASCADE
約束進行一些研究,以了解更多詳細信息。
(編輯 #2 )這是MySQL 文檔中的修改示例:
CREATE TABLE product (
category INT NOT NULL, id INT NOT NULL,
price DECIMAL,
PRIMARY KEY(category, id)
) ENGINE=INNODB;
CREATE TABLE customer (
id INT NOT NULL,
PRIMARY KEY (id)
) ENGINE=INNODB;
CREATE TABLE product_order (
no INT NOT NULL AUTO_INCREMENT,
product_category INT NOT NULL,
product_id INT NOT NULL,
customer_id INT NOT NULL,
PRIMARY KEY(no),
INDEX (product_category, product_id),
INDEX (customer_id),
FOREIGN KEY (product_category, product_id)
REFERENCES product(category, id)
ON DELETE CASCADE,
FOREIGN KEY (customer_id)
REFERENCES customer(id)
) ENGINE=INNODB;
該示例顯示了product
和product_order
之間的關系。 當從product
表中刪除一條記錄時(只需運行DELETE FROM product WHERE id=... and category=...
), product_order
表中所有引用的記錄將被自動刪除,無需任何額外的 SQL 語句。 另一方面,當從customer
表中刪除一行時,您將得到與現在相同的錯誤,因為在這種情況下默認約束限制對記錄的刪除操作。
例如;
DELETE FROM progress FROM progress INNER JOIN offices ON progress.RegNo = offices.RegNo WHERE offices.ProjectID = :id;
DELETE FROM offices WHERE offices.ProjectID = :id;
DELETE FROM workrooms WHERE workrooms.ProjectID = :id;
注意:使用參數將值傳遞給查詢,而不是直接將值添加到字符串中。 如果不這樣做,您可以將代碼暴露給 SQL 注入。 所以你要注意。我想通過一個例子來解釋這里的辦公室和房間。
在 dlete 操作之前和之后禁用和重新啟用外鍵約束怎么樣。
alter table Resetkeys nocheck constraint all
delete from Resetkeys ...
alter table Resetkeys check constraint all
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.