一个关于数据库多表查询及更新的问题,为了说清楚,我用 Access 做了个小例子: 数据库中有三个表和一个查询。 三个表是:“教师表”、“课程表”、“教师所带课程表”。 “教师表”有“教师编号”、“教师姓名”两个字段;“课程表”有“课程编号”、“课程名称”两个字段;“教师所带课程表”有一个“自动编号”的主键字段,以及“教师编号”、“课程编号”共三个字段。“教师表”和“课程表”是多对多的关系,通过“教师所带课程表”(这就是个连接表)来实现这个多对多关系的。 还有一个查询:“教师所带课程查询”。这个查询是用来给客户看的,让客户知道哪些老师带了哪些课。查询所对应的sql语句是:
SELECT 教师表.*, 课程表.*
FROM 课程表 INNER JOIN (教师表 INNER JOIN 教师所带课程表 ON 教师表.教师编号 = 教师所带课程表.教师编号) ON 课程表.课程编号 = 教师所带课程表.课程编号; 我在数据库中定义了三张表的关系,并且选择了实施参照完整性、级联更新相关字段、级联删除相关字段。 现在的问题是:比如运行了这个查询后,其中有一条记录:“编号为2的老师带了一门编号为5的课程”。如果我在查询结果中删除这个纪录,在 Access 中就只删除了“教师所带课程表”的对应纪录,这个结果是对的! 但是 我在 BCB 中用数据组件(TADOConnection、TADOTable、TDBGrid、TDBNavigator)进行这个操作时,结果竟然把“教师表”中“编号为2的老师”的纪录,以及“课程表”中“编号为5的课程”也同时给删除了!!这个显然是不对的! 这是怎么回事呀??
SELECT 教师表.*, 课程表.*
FROM 课程表 INNER JOIN (教师表 INNER JOIN 教师所带课程表 ON 教师表.教师编号 = 教师所带课程表.教师编号) ON 课程表.课程编号 = 教师所带课程表.课程编号; 我在数据库中定义了三张表的关系,并且选择了实施参照完整性、级联更新相关字段、级联删除相关字段。 现在的问题是:比如运行了这个查询后,其中有一条记录:“编号为2的老师带了一门编号为5的课程”。如果我在查询结果中删除这个纪录,在 Access 中就只删除了“教师所带课程表”的对应纪录,这个结果是对的! 但是 我在 BCB 中用数据组件(TADOConnection、TADOTable、TDBGrid、TDBNavigator)进行这个操作时,结果竟然把“教师表”中“编号为2的老师”的纪录,以及“课程表”中“编号为5的课程”也同时给删除了!!这个显然是不对的! 这是怎么回事呀??
qryDelete = new TADOQuery(NULL);
qryDelete->Connection = ADOConnnection;
qryDelete->SQL->Add("Delete FROM 教师所带课程表 WHERE (教师编 号 = '2' AND 课程编号 = '5')");
qryDelete->ExecSQL(); 这个操作实际上是直接删除数据库中对应的纪录。然后 DataSet->Delete(); 这个操作就是删除了DataSet中缓存的对应的纪录(此纪录所对应的数据库中的纪录已经在第一步中删除了),当然和DataSet相关联的Grid中显示的对应纪录也消失了。 我的这种方法,就是需要程序员来保证“数据库中的记录集”和“客户端显示的记录集”保持一致!