在数据库中使用外键和级联删除

前一阵子写了1个项目,这个项目有ios和android2个版本,都使用了sqlite数据库。数据库内容也不是太复杂,但是我们在操作时没有利用数据库的级联删除等功能,导致代码复杂,现在分析一下。

比如系统需要2个表,表Person表示人的信息, 包含personID,personName,  表Treatement表示治疗方案,包含用药名称,用药剂量,用药时间。一个人可以对应多个治疗方案。

以下是我用的设计

personID int
name varchar

 

personID int
medicineName varchar
dosage float
time date

看看这里的问题,

首先没有使用主键,虽然这里的personID明显应该设置为主键,因为但是没这个意识。这导致我在添加person时,需要验证是否已经存在相同的id。

第二,没有在第二张表中使用外键。第二张表中项目,表示一个人对应的治疗方案,如果这个人被删除了,那么所有的治疗方案也该被删除。这里perosnID应该设置为外键,关联表1的personID,这样就可以利用级联删除,保证2张表的一致性。而且,还可以保证不会在表2中产生一个不存在的人的治疗方案!

下面从网上摘抄一点关于外键和数据库的知识,感谢原作者的辛勤付出!


 

级联删除 
 
删除包含主键值的行的操作,该值由其它表的现有行中的外键列引用。在级联删除中,还删除其外键值引用删除的主键值的所有行。
语法:
Foreign Key
(column[,...n])
references referenced_table_name[(ref_column[,...n])]
[on delete cascade]
[on update cascade]
注释:
column:列名
referenced_table_name:外键参考的主键表名称
ref_name:外键要参考的表的主键
on delete:删除级联
on update:更新级联
SQL级联删除——删除主表同时删除从表——同时删除具有主外键关系的表
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‘

 外键的作用

保持数据一致性,完整性,主要目的是控制存储在外键表中的数据。 使两张表形成关联,外键只能引用外表中的列的值或使用空值。

在数据库中使用外键和级联删除

上一篇:[原创]EnterpriseDB测试key申请方法


下一篇:MS SQL还原备份数据出错