我在从数据库中删除数据时遇到了问题。 我在我的春季启动应用程序中使用Hibernate orm,现在是我想从db中删除用户的时刻。但是有重新组合,一些表包含父表用户的外键。如何删除链接所在的所有数据? 以下是我的所有表:以及带键的列的名称:
- User - id
- Workers - id(fk)
- Resetkeys - userId(fk)
- UserRole - userId(fk)
- Tokens - userId(fk)
如何删除所有这些数据的用户? 谢谢你的帮助!
答案 0 :(得分:0)
如何在dlete操作之前和之后禁用和重新启用外键约束。
select recipe_id,recipe_name,recipe_weight,recipe_aprox_price,recipe_raiting,recipe_calories,recipe_user_id,recipe_kcategory_id,recipe_fcategory_id,recipe_published_date,comp_id, comp_name,comp_weight,comp_description,comp_calories,comp_recipe_id from public.recipe_store INNER JOIN public.recipe_components ON (public.recipe_store.recipe_id=public.recipe_components.comp_recipe_id)
答案 1 :(得分:0)
(的被修改强>)
如果没有对Spring或Hibernate这样的框架的任何引用,您可以简单地设置具有外键列约束的数据库表,以便在" user"时删除所有相关记录。记录被删除。约束称为ON DELETE CASCADE
,如果在连接表的外键列上定义约束,则RDBMS将自动删除外键与已删除记录的选定用户ID匹配的所有记录。
尝试专门针对您正在使用的数据库服务器进行ON DELETE CASCADE
约束的研究,以获取更多详细信息。
(编辑#2 ) 以下是Mexico's central:
中的已修改示例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
表中删除一行时,您将得到与现在相同的错误,因为在这种情况下,默认约束会限制对记录的删除操作。
答案 2 :(得分:0)
您是否在模型中使用了关系注释? 像这样,
@OneToMany(cascade = CascadeType.REMOVE )
请参阅规范https://docs.oracle.com/cd/E19798-01/821-1841/bnbqm/index.html
答案 3 :(得分:0)
例如;
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 注入。所以你要注意。我想通过一个例子来解释这里的办公室和房间。