另建主键,还是用表中原有的主键?大家应该都遇到过这种问题:
比方说有一个表,其中的a列+b列+c列可以唯一标示一个实体。
我们可以使“a列+b列+c列”设为主键,也有人喜欢另外建一个主键用的类型也是各异,有人喜欢用char,有人喜欢用int,
有人喜欢用dec,有人喜欢identity.这在我们建表的时候可能司空见惯了。
不知各位喜欢怎样设主键?还有这其中的学问有前辈可以指教一下吗?

解决方案 »

  1.   

    实际上,现在好多数据库(如Access,Ms Sql Server)都有一种自增型字段,可以用它当作主键,这样是最方便的
      

  2.   

    如果a列、b列、c列都无须用户参与(如这三列都不需用户录入、修改),可直接把主键设为a列+b列+c列;反之,就再加一个字段作为主键。避免用户的参与。由数据库直接生成若由程序产生。
      

  3.   

    我感觉主要还是取决于设置表之间关系,比如,如果商品表的代码列被进货表引用,那可以将商品表的代码列做设为主键,实现引用完整性时也要求类似的做法,即主表(商品表)与从表关联,主表用于关联的列得是主键。如果不做表关联,不实现引用完整性,就可以用像ACCESS里ID字段自动编号做主键。ACCESS和SQLSERVER都代示例数据库,很不错的参考。
      

  4.   

    我反对用char类型作主键,为用char类型做主键不但占用空间大,而且效率较其他类型低。
    对于主表可用一唯一的整形字段作为主键。从表可用外键+记录生成时间作为作为主键。
      

  5.   

    有很多时候不用char类型做主键,就要另外新建一个主键列,
    因为很多天然的主键都是char类型或varchar类型呀。
      

  6.   

    我比较讨厌自增,在删除的时候比较麻烦
    整型不错,char,和整型+char也不错,如果再不行,就加个日期型,查询时好用
      

  7.   

    我反对用 自增型变量!,如果没有数据删除还好,如有,会乱得一塌糊涂!还是char型,也不是很好,最好是整数型.如要自增,自已在程序中控制!
      

  8.   

    cocoboy79的意见还可以。
    我还有个习惯,不知好不好
    我喜欢把不能重复的列设置为主键。请朋友议议
      

  9.   

    回复人: JetJack(喷气引擎)  
     
      我反对用char类型作主键,为用char类型做主键不但占用空间大,而且效率较其他类型低。
    对于主表可用一唯一的整形字段作为主键。从表可用外键+记录生成时间作为作为主键。-----------------------------------------------------------这样不妥,如果在同一时间大批量多人此,或者系统倒入数据,会出现主键冲突。
      
     
      

  10.   

    要有多个数据库同步的系统时,
    一是用“本地编号(int)+区号(int)”做主键,在全局范围内唯一表示一个实体。
        如:00001223  +  16
    二是用可以全局编码的(char)做主键 
        如:"1600001223"不知诸位以为怎样做好?或有其他的高见?
      

  11.   

    Steve_csdn() :
    还是用oracle的序列来生成主键好点。用char还是用char都可以,习惯上用char多些。
    用“本地编号(int)+区号(int)”做主键不但太复杂,而且在纪录跨区号转移时,主键会有问题。
      

  12.   

    我的习惯sql server只设主键,然后用触发器建立关系。
      

  13.   


    1.合理使用索引      索引是数据库中重要的数据结构,它的根本目的就是为了提高查询效率。现在大多数的数据库产品都采用IBM最先提出的ISAM索引结构。索引的使用要恰到好处,其使用原则如下:  ●在经常进行连接,但是没有指定为外键的列上建立索引,而不经常连接的字段则由优化器自动生成索引。  ●在频繁进行排序或分组(即进行group by或order by操作)的列上建立索引。  ●在条件表达式中经常用到的不同值较多的列上建立检索,在不同值少的列上不要建立索引。比如在雇员表的“性别”列上只有“男”与“女”两个不同值,因此就无必要建立索引。如果建立索引不但不会提高查询效率,反而会严重降低更新速度。  ●如果待排序的列有多个,可以在这些列上建立复合索引(compound index)。  ●使用系统工具。如Informix数据库有一个tbcheck工具,可以在可疑的索引上进行检查。在一些数据库服务器上,索引可能失效或者因为频繁操作而使得读取效率降低,如果一个使用索引的查询不明不白地慢下来,可以试着用tbcheck工具检查索引的完整性,必要时进行修复。另外,当数据库表更新大量数据后,删除并重建索引可以提高查询速度。  2.避免或简化排序  应当简化或避免对大型表进行重复的排序。当能够利用索引自动以适当的次序产生输出时,优化器就避免了排序的步骤。以下是一些影响因素:  ●索引中不包括一个或几个待排序的列;  ●group by或order by子句中列的次序与索引的次序不一样;  ●排序的列来自不同的表。  为了避免不必要的排序,就要正确地增建索引,合理地合并数据库表(尽管有时可能影响表的规范化,但相对于效率的提高是值得的)。如果排序不可避免,那么应当试图简化它,如缩小排序的列的范围等。  
    ============================
    @* .☆ / */ . / * . ☆/ *。
       ◢◣。       ◢◣。
      ◢★◣。     ◢★◣。
     ◢■■◣。   ◢■■◣。
    ◢■■■◣。 ◢■■■◣。
    ︸︸||︸︸ !!︸︸||︸︸
    愿您有快乐的每一天 ^_^!!0
      

  14.   

    补充 CXZ9(一网情深)关于索引的一点经验:
    在ORACLE(我仅仅用过ORACLE :( )中,如果字段为空,则索引会变得无效,可以用触发器控制关键字段是否为空。
      

  15.   

    http://www.csdn.net/expert/topic/1068/1068305.xml?temp=.9567072
      

  16.   

    http://www.csdn.net/expert/topic/1069/1069278.xml?temp=.4434168
      

  17.   

    新建一个数据表,将a,b,c,都变为其属性.
      

  18.   

    提供一种方法:按子系统划分为区段  比如: 统计 tj  / 财务 cw 等 建立一子系统主键生成表记录 每一个子系统有唯一区段的主键   tj 1XXXXX的所有数据 1开头   cw 2XXXXX的所有数据  2开头   采用numeric 可到足够大   java 类型 BigDecimal 
    这样主键不会重复,而且可以方便的让分布式数据并库
      

  19.   

    字符型主键非常不好,具体编程时,尤其系统大时,
    问题多不胜数。
    用SEQUENCE生成主键,数值型,比较好用,问题也少。
      

  20.   

    我也是另建一个long int 型的主键
      

  21.   

    谈谈我的看法。
    首先明白主键的含意。主键是在数据表中一条记录的唯一标志。正因为它如此重要,主键相对于表中其它字段来说要做到相对稳定,在一条记录的整个生命周期内都不应该发生变化。如果用面向对象的观点来解释,有点com对象中的GUID.
    这个唯一编号由客户端来生成,用户不可见,具体的算法可以根据当前用户,当前时间,甚至用GUID(有的数据库可以支持).重复的几率非常小可,可以不考虑主键重复问题。
    优点1:通过这种设计,主键的获取依赖于客户端,而不是服务器,可以提高并发性.
        2.减少表间的依赖关系。如对于有主细关系的表,如果主表资料发生变化不影响细表的关联.