比如 Student 和 class 表student表的classId 关联class 表的classId
class表的主键为classID 岂自动增长。①如果一个班级不存在了,级联删除的时候,就应该删除所有的学生。
②“级联更新相关的记录”指现STUDENT中一有个学生属于1班,但现在CLASS中的1班的CLASSID改为2了,则STUDENT中相应记录的值也会改为2。CLASS表中 CLASSID 主键 自动增长的话,那该怎么修改班级ID呢?去掉自动增长吗?
我开发中所有的id都是自动增长的,外键关联主键的ID也是自动增长。这样自动增长的ID就修改不了了啊。有没好的解决办法啊?
class表的主键为classID 岂自动增长。①如果一个班级不存在了,级联删除的时候,就应该删除所有的学生。
②“级联更新相关的记录”指现STUDENT中一有个学生属于1班,但现在CLASS中的1班的CLASSID改为2了,则STUDENT中相应记录的值也会改为2。CLASS表中 CLASSID 主键 自动增长的话,那该怎么修改班级ID呢?去掉自动增长吗?
我开发中所有的id都是自动增长的,外键关联主键的ID也是自动增长。这样自动增长的ID就修改不了了啊。有没好的解决办法啊?
标题:两表通过字段关联进行级联删除。
作者:爱新觉罗·毓华(十八年风雨,守得冰山雪莲花开)
时间:2008-11-20
地点:广东深圳
*/create table ta(id int not null)
create table tb(id int , aid int)
insert into ta values(1)
insert into ta values(2)
insert into tb values(1 , 1)
insert into tb values(2 , 2)
insert into tb values(3 , 1)
go--一、查看原始数据
--ta表的原始数据
select * from ta
/*
id
-----------
1
2
*/
--tb表的原始数据
select * from tb
/*
id aid
----------- -----------
1 1
2 2
3 1
*/--二、看看没有创建级联删除时的情况(删除ta表id=1的数据,看看是否影响tb表)
delete from ta where id = 1
select * from ta
/*
id
-----------
2
*/
select * from tb
/*
id aid
----------- -----------
1 1
2 2
3 1
*/--三、恢复原始数据,创建级联删除,删除ta表id=1的数据,看看是否影响tb表
insert into ta values(1)
--为ta创建主健
alter table ta add constraint pk_ta_id primary key (id)
go
--为tb创建外健,并指定级联删除
alter table tb add constraint fk_tb_aid foreign key (aid) references ta(id) on delete cascade
go
delete from ta where id = 1
select * from ta
/*
id
-----------
2
*/
select * from tb
/*
id aid
----------- -----------
2 2
*/--删除级联约束
alter table tb drop constraint fk_tb_aid
go
--删除测试表
drop table ta , tb
go
只能说你还没理解数据库的主/外键关系.
数据库表有主键,唯一,比如学生的学号.
另一些数据表称为从表,比如学生成绩表.一个学生成绩必然要指定一个学号,才能知道这个成绩是谁的.
因此,成绩表中的学号,就是一个外键,它指向学生表(主表)的主键.保证了数据库的一致性.如果删除了学生表中的某个学生,这个学生的学号没有了,因此成绩表中的外键(即成绩表中的学号),就没有存在的意义了,因为,这个成绩没有主人了,不知道是谁的.数据库的一致性出问题了.
怎么办,用主/外键关系自动删除,在创建外键的时候用cascade,实际上称为级联删除,即表的主键删除,其相关的从表中对应的外键行也删除.但是,主表中有主键,并不意味着从表中也一定得有对应的外键行,比如,学生来了,有学号,但是,还没考过试,那在成绩表中就没有这个学号,所以,主键的增长,与从表没关系,只在从表用到它时,才会去插入相应的行.外键表也可以设置主键,但这个主键是指外键表本身的主键.正如你的班级表有班级ID的主键,学生表也有主键,但它是学号ID,它的行中有外键班级ID,它必须与主表中的班级ID对应,但这与它的学号ID是没有关系的.