sql 增加键约束 删除主记录在其他表中的相关记录

本文展示了一个SQL脚本示例,该脚本为表`t_workflow_approval`添加了一个外键约束,指向`t_workflow_form`表,并设置了级联更新和删除的行为。


ALTER TABLE [dbo].[t_workflow_approval]  WITH CHECK ADD  CONSTRAINT [FK_t_workflow_approval_t_workflow_form] FOREIGN KEY([indexid])
REFERENCES [dbo].[t_workflow_form] ([id])
ON UPDATE CASCADE
ON DELETE CASCADE
GO

ALTER TABLE [dbo].[t_workflow_approval] CHECK CONSTRAINT [FK_t_workflow_approval_t_workflow_form]
GO

转载于:https://www.cnblogs.com/y0umer/archive/2012/05/25/3839250.html

### SQL 删除约束中一条记录的方法 在数据库设计中,当存在关系时,直接删除中的某条记录可能会受到外约束的影响而失败。这是因为外的存在是为了维护数据的一致性和完整性[^4]。 #### 处理方法一:先删除(多)的相关记录 如果希望保留外约束并安全地删除中的记录,则需要手动清理掉所有依赖于该记录的从数据。具体操作如下: 1. **查找从中与目标记录相关的所有数据** 使用 `SELECT` 查询语句定位这些相关记录。 2. **删除中的相关记录** 执行 `DELETE FROM 子 WHERE 条件` 的命令来清除这些关联数据。 3. **最后删除中的目标记录** 当所有的从记录都被成功移除后,再执行针对删除操作。 示例代码: ```sql -- 假设为 user,从为 orders,两者通过 user_id 关联 -- 步骤 1 和 2: 清理从中的相关记录 DELETE FROM orders WHERE user_id = 值; -- 步骤 3: 删除中的对应记录 DELETE FROM user WHERE id = 值; ``` 这种方法适用于不允许自动级联删除的情况,并能更好地控制哪些数据应该被保留或丢弃[^5]。 --- #### 处理方法二:启用 ON DELETE CASCADE 级联删除功能 另一种更高效的方式是在定义外时设置 `ON DELETE CASCADE` 属性。这样做的好处是一旦中的某个记录删除,与其相匹配的所有从记录也会随之自动消失,无需额外编写脚本来逐一处理它们。 实现此逻辑需调整原有的外声明语法如下所示: ```sql ALTER TABLE orders ADD CONSTRAINT fk_user_orders FOREIGN KEY (user_id) REFERENCES user(id) ON DELETE CASCADE; ``` 上述语句示每当有用户 (`user`) 被删除的时候,所有隶属于这个用户的订单(`orders`)都会一同被消除[^3]。 之后只需简单运行一次标准形式的 `DELETE` 即可完成整个过程: ```sql DELETE FROM user WHERE id = 值; ``` 需要注意的是,虽然这种方式简化了流程,但也增加了误删的风险——一旦错误地触发了一个父项的删除动作,就可能导致大量子项目无条件丢失。因此,在实际应用前应充分评估业务需求以及潜在后果。 --- #### 特殊情况下的解决办法 —— 暂时禁用外检查 某些场景下可能既不想永久更改现有的外行为模式,又暂时无法满足正常删除所需的前置条件。此时可以通过临时关闭 MySQL 数据库中外验证机制的办法绕过当前障碍后再恢复正常状态: 开启/关闭外检测开关命令分别为: ```sql SET FOREIGN_KEY_CHECKS=0; -- 关闭外检查 ... SET FOREIGN_KEY_CHECKS=1; -- 开启外检查 ``` 不过这种做法仅推荐用于调试或者特殊迁移任务期间使用,切勿长期处于未受保护的状态之下以免破坏整体架构稳定性[^1]。 --- ### 总结 综上所述,面对带有约束的关系型数据库结构时,要顺利达成单一记录的销毁目的要有三种途径可供选择:一是遵循严格的分步策略依次处置;二是借助预先配置好的自动化工具减少人为干预程度;三是利用系统层面提供的灵活性选项快速突破瓶颈但伴随一定风险系数提升。每种方案各有优劣之处,最终选用哪一种取决于具体的环境设定和个人偏好等因素共同决定。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值