甲:

由于各种原因,我们项目中的数据库是从别的地方导过来的,很多表都没有主键。


你现在问去掉主键的好处,也谈到数据的完整性,那么我现在我的看法:


数据完整性的看法:数据的完整性不是靠主键来维护的。如果说你的程序不加以唯一、唯空控制,让数据库帮你来做这个判别。那么你所得到的结果,无非是从数据库层抛出一个异常,并不能解决项目中的任何问题。为了一个主键,你就不让人插数据了???


好处:如果建一个主键,我们不谈他是否占空间的问题。我想说的是主键的维护。主键维护要么由程序生成,要么由数据库创建一个序列。如果我有一百多张表,为了让每一张表都有一个不交叉的序列,我是不是要建一百多个序列???如果我不建主键,这些工作是不是省了???


乙:

既然楼主不愿意创建主键,那么想必通过唯一约束和非空约束来替代主键的方式,楼主更不会考虑了,更麻烦,楼主考虑这几种情况么:
1. 如何更新数据库的某一条数据,既不存件主键也不存在唯一约束,楼主如何定位到具体的某一条唯一的记录,特别是经常碰到的问题类似存在则更新不存在则插入这样的问题。如果楼主的系统中不需要唯一的记录,那么在查询结果中,哪条结果才是真正需要的结果如何分辨

2. 不存在主键,那么意味着所有列都可以容易更新,也就是说今天看见的数据,明天可以由于误操作或者其他原因不见了,楼主怎么查找类似这样的问题。在存在关联关系的表上,如果更新了有关的字段,而不更新存在关联关系的表的相关字段,那么将来数据核对起来是一件多么困难的事情

3. 楼主也许相让程序来实现这个唯一非空限制,那么楼主想过并发操作么,也许两个用户同时在更新/插入,或者由于网络延时或者由于CPU时间片的分配问题,或者其他各种各样的问题,导致同样的记录通过程序的检测进入数据库。

4. 楼主考虑过项目过程中,可能出现手工填补数据的问题么,总不能要求手工填补数据的人员每次插入或者更新数据的时候都先查询一次数据库,就算这样还存在并发操作的问题呢,也许两个手工填补数据的人员同时插入同样的记录,或者手工填补的记录和系统插入同样的记录。

... 可能的情况太多了,偶说不动了

楼主所说的通过程序控制唯一和非空,无非就是存在轮子的时候,重新费力造一个轮子,和花在程序修改、调试的时间上比,增加主键不是更简单的事情么