(+)是外连接,表示当前条件等号左侧的表为主表,如果等号条件成立,查询中如果有等号右侧表中的字段,按照关联条件查询出数据,如果右侧没有条件符合,那么查询中补空。
举个例子,假设emp和dept表数据如下:
emp: emp_id, emp_name, dept_id
001 张三 10
002 李四 10
003 王五 20
004 赵六 30
dept: dept_id dept_name
10 部门1
20 部门2
查询语句:select emp_id, emp_name, dept_name
from emp, dept
where empdept_id = deptdept_id(+);
从上面两表能看出来,emp表中的最后一行数据,dept_id为30,在dept表没有对应的数据,使用直连(即不带加号)只能查询到前三行数据,可是使用外连,以emp为主表,那么emp表的数据就都可以查到。结果如下:
emp_id emp_name dept_name
001 张三 部门1
002 李四 部门1
003 王五 部门2
004 赵六 NULL(空,没有数据)
级联删除你可以把它认为是一个触发器,也就是你删除主表中的数据,那么从表中的相关联的也就一起删除了。。。看个例子:======================create table a
(
id varchar(20) primary key,
password varchar(20) not null
)
create table b
(
id int identity(1,1) primary key,
name varchar(50) not null,
userId varchar(20),
foreign key (userId) references a(id) on delete cascade
)
表B创建了外码userId 对应A的主码ID,声明了级联删除
测试数据:
insert a values ('11','aaa')
insert a values('23','aaa')
insert b values('da','11')
insert b values('das','11')
insert b values('ww','23')
删除A表内id为‘11’的数据,发现B表内userId 为“11”也被数据库自动删除了,这就是级联删除
delete a where id='11'=============================================================级联更新也大同小异。。只是关键字为:on update希望回答对你有所帮助
按照你现在这两个表的设计来看,最简单的改法就是,把SmallClassID表中的BigClassName和EnBigClassName这两个字段去掉,换成BigClassID这个字段,存放它上级目录的ID,设置成外键字段,指向BigClass表中的主键。
然后你在代码里面生成目录的时候,先生成一级目录,例如:
Select
from
BigClass
这样就可以把一级节点都生成,然后再对每个一级节点生成其下级节点,比个给产品分类这个节点生成下级节点,可以用:
Select
from
SmallClass
where
BigClassID
=
46(即取当前节点对应的ID)
这样就可以查到它的子节点了。
这个是对你改动最小的,但是最好的实现方法是只用一张表去实现,设置一个ParentID的字段,存储其父节点的ID,也就是一个指向自己这张表的外键,然后用递归算法去生成目录,这样就比较灵活,不管有几级的目录都可以。
无 *** 作:当在删除或更新主键表的数据时,将显示一条错误信息,告知用户不允许执行该删除或更新 *** 作,删除或更新 *** 作将会被回滚。
层叠:删除或更新包含外键关系中所涉及的数据的所有行。
说明:“层叠”在SQL Server 2000中又叫“级联”。
设置空:这是SQL Server 2005新增的功能。如果表的所有外键列都可以接受空值,则将该值设置为空。
说明:要将外键的删除规则和更新规则设为“设置空”,则该外键必须是可以为空的字段。
设置默认值:这是SQL Server 2005新增的功能。如果表的所有外键列都已定义了默认值,则将该值设置为该列定义的默认值。
说明:要将外键的删除规则和更新规则设置为“设置默认值”,该外键必须是有默认值的字段。
--我也是初学者,共同研究下,你最好一段一段执行,要不就没意义了
use school
drop table teacher1
drop table student1
go
create table teacher1
(
t_id int primary key,
t_name nvarchar(10) not null
)
go
insert into teacher1 values(1347,'张三')
insert into teacher1 values(2680,'李四')
insert into teacher1 values(6379,'王五')
go
create table student1
(
s_id int primary key,
t_id int
)
go
alter table student1
add constraint FK foreign key(t_id) references teacher1(t_id) on update cascade
insert into student1 values(1,2680)
insert into student1 values(2,6379)
insert into student1 values(3,1347)
insert into student1 values(4,6379)
insert into student1 values(5,1347)
--两个表建好了,大概按照你的意思,不知道是不是这种情况
go
select from student1;
select from teacher1; --查询所有数据
go
--在student1表(外键表)中加入一组数据
insert into student1 values(6,1234) --失败了,因为外键表中外键的值必须是引用主键表中关联的主键的值
--也就是外键约束,或称参照完整性
--外键约束是约束外键的数据的取值的
insert into teacher1 values(1234,'童川') --然后在teacher1表(主键表)中加一组数据
--成功,外键约束对主键表被引用的主键无影响
insert into student1 values(6,1234) --成功,验证了失败的原因
go
select from student1;
select from teacher1; --再次查询所有数据
--on update cascade 这个东西我也没学过,百度了一下,大概明白了
go
update teacher1 set t_id = t_id + 10000
where t_name in('童川') --成功
update student1 set t_id = t_id + 10000 --提示与外键约束发生冲突
go
select from student1;
select from teacher1; --看到了么学生表中引用'童川'老师的数据的一列数据中t_id的值也随之改变
--我想这就是on update cascade的作用
可以通过在数据库中设置外键约束来实现级联更新相关字段,具体步骤如下:
1 在两个表中分别创建外键字段,并且设置外键约束;
2 在外键约束中设置级联更新,即当主表中的数据发生更新时,从表中相关字段也会自动更新;
3 保存设置,完成级联更新设置。
以上就是关于oracle语句的级联问题,这个语句e.mgr=m.empno(+) 谁可以给我讲讲这个是什么意思还带有(+)详细解答哦!全部的内容,包括:oracle语句的级联问题,这个语句e.mgr=m.empno(+) 谁可以给我讲讲这个是什么意思还带有(+)详细解答哦!、sql中级联删除,级联更新是怎么理解的、数据库级联二级目录怎么实现等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)