不解的事情接踵而来,关于表间关系约束问题
客户档案表:
ykh.khbh 客户编号,主键
ykh.khmc 客户名称,唯一索引
单据表:
yiomain.mno 单据号,主键
yiomain.khbh 无索引
要求:单据表的KHBH允许为空,要求如果有值必须来自ykh.khbh ;若单据表有记录,则客户档案表的相关记录不能删除。建立了ykh.khbh 与yiomain.khbh的关系,选中“对INSERT和UPDATE强制关系”,不选两个级联。
遇到的问题是:单据表中新增记录时,不设置khbh就无法插入。
************************************
这个问题在写到“单据表的KHBH允许为空”时,我发现了原因:是我多事,为了在表中看了顺眼,给所有的字段都设置了默认值,yiomain.khbh的默认值为 ' '!在SQL中, ' '是有值的,而真正的空值应当是NULL!所以将默认值删除就解决了。
呵~~~~~既然写了,就发出来给大家提个醒了~~~~关系中用到的字段,要谨慎设置默认值!
[解决办法]
这种关系,也就是关系数据库中的外键参照。 指 单据表 中的记录中的khbh字段值必须是 客户档案表 中存在的。 而空显然是在表客户档案表不可能存在的。 自然就不让你插入数据。
这也是为什么有些观点是不在数据库中设置这种外键关系,而是自己通过程序实现。 (这个观点不一定正确)
从实际业务观点, 如果连客户都不知道,怎么创建订单? 如果是新客户,一般的软件设计是,1)创建新客户,2)创建些客户的订单。
[解决办法]
主、外键关系,从数据完整性的角度出来,应该将KMKH设为外键,并加索引,当然,根据你的实际情况判断
[解决办法]
你这样设置关系,好处是客户端程序编写简单。
如果不怕麻烦,可以不设置关系,把这些问题交给客户端,如:
删除客户档案时,检测此客户是否有订单,有则不让删除,无则可以删除。
而单据表中的客户编号是通过下拉列表框选择客户表中的记录。
也就是说一些限制、报错信息等由你控制。
[解决办法]
客户编号这种字段应该是不允许为空的,否则某张单据就可能变成孤魂野鬼,在做财务报表时,这张单应该向谁收款或者付款给谁呢?只有在用户的业务规则允许存在不确定账单时才有可能设计成允许为空,不过这会造成财务监管漏洞,通常我们的处理原则是说服用户,无法说服的话就在合同中明确说明,以免客户对不上账时把责任推给软件。
表间关系的校验应该交给数据库去处理,不赞成用前端代码来处理,这在团队开发中尤其重要,如果交给前台代码来校验,你很难保证所有程序员都编写了完整的校验代码;即使不是团队开发,从性能上来看,交给数据库处理也好于前端代码处理的效果。另外,在移植代码到其他语言时也可以有效的减少工作量(当然,如果更换数据库平台的机会大于更换开发语言的机会,结果则正好相反)。
[解决办法]
建立关系来约束,写代码轻松点
没错,交给数据库完成