简简单单说外键和级联(2)
来源:未知 责任编辑:责任编辑 发表时间:2014-05-20 18:34 点击:次
[sql]
create table t_main
(
id int primary key,
[content] varchar(100) not null
)
create table t_branch
( www.2cto.com
mainId int Primary key ,
[content] varchar(100) not null,
foreign key(mainId) references t_main(id)
)
执行语句,现在我想直接在t_branch中插入一条数据insert into t_branch values(3,'分支表'),提示如下:INSERT 语句与 FOREIGN KEY 约束"FK__t_branch__mainId__4F7CD00D"冲突。该冲突发生于数据库"beidaqingniao",表"dbo.t_main", column 'id'。
我想删除t_main语句drop table t_main,提示如下:无法删除对象 't_main',因为该对象正由一个 FOREIGN KEY 约束引用。
在这两个表中,该外键的作用是,t_main中没有的外键值t_branch不能插入,而t_branch 正在引用t_main所以也不能只先删除t_main,否则t_branch中的数据会被孤立。我觉得,外键对主表的作用更倾向于不能删除,而对从表的作用更倾向于不能随便添加。
级联删除
但是如果想级联删除怎么办?总结出三种办法。
sql语句修改设置:因为默认的外键触发是“不执行任何操作”,所以我们可以使用sql语句更改设置:
[sql]
FOREIGN KEY(id)REFERENCES tabley(id) on delete cascade on update cascade
意思是从表会跟随主表的改变而改变。
可视化修改:不想写代码,也可以可视化操作,新建数据库关系图,选择主表和从表添加,其关系也会自动添加。选择主表或从表---右键---关系---insert和update规范---级联。如图:
当然也可以使用触发器,触发器的基础知识,欢迎访问我的博客《详解sql中的触发器》http://www.2cto.com/database/201206/135523.html
[sql]
-- =============================================
-- Author: 李达
-- Create date: 2012年6月10日 18:11:46
-- Description: 简单的级联删除
-- =============================================
ALTER TRIGGER [dbo].[trigCascadeDelete] --触发器名
ON [dbo].[main] ---作用于哪张表 www.2cto.com
instead of delete ---什么动作触发
AS
BEGIN
declare @id int --声明@id变量
select @id=id from deleted --取出要删除的id
delete from branch where mainId =@id --先删除从表中的数据行
相关新闻>>
最新推荐更多>>>
- 发表评论
-
- 最新评论 更多>>