一个管理员的表中有三个属性,id、userName、password.id为主键并为自增属性,我觉得userName也是唯一的,为什么不作为主键,而需要多设一个id自增属性的作用

解决方案 »

  1.   

    如果就这个表而言,username是唯一的话,它是可以作为主键的但是往往这种的主键会是另一个表的外键,当usename修改时,则需要修改两个表的信息,
    否则会出现更新异常,导致两个表的信息不一致。
      

  2.   

    原因很多啊:
    1:即使userName是唯一的,建立了主键,那么你将来要像对记录进行排序,对哪个字段排呢?对userName吗?这是字符型的,排序的结果往往是根据字母表的顺序。
    2:如果你想唯一确定一条记录,通过userName当然可以,但是最关键的是假如你有100万的记录,你想列表出所有用户,
    你就必须对表分页查询,那么我问你:难道你的分页依据是userName吗?这是最重要的。
    3:如果你有1000万条记录呢?你像查询出某个记录的话,你难道通过userName的主键或者这个唯一性索引来查找吗?
    这样还是很慢的,那么你要分区!分区的依据是什么?!userName是字符型的,不能分区字段的。必须是INT或者其它INT类型的,那么就需要一个ID了。
    这些原因够有说服力了吧?
      

  3.   

    你可以用约束
    create table tb (ID int ,[name ]varchar(10) unique)
    alter table tb
    add constraint qu unique([name])
    UNIQUE   约束   
      可使用   UNIQUE   约束确保在非主键列中不输入重复值。尽管   UNIQUE   约束和   PRIMARY   KEY约束都强制唯一性,但在强制下面的唯一性时应使用   UNIQUE   约束而不是   PRIMARY   KEY   约束:     
        
      非主键的一列或列组合。     
      一个表可以定义多个   UNIQUE   约束,而只能定义一个   PRIMARY   KEY   约束。   
        
      允许空值的列。     
      允许空值的列上可以定义   UNIQUE   约束,而不能定义   PRIMARY   KEY   约束。   
        
      FOREIGN   KEY   约束也可引用   UNIQUE   约束。   
        
      ------------------------------------------------   
        
      UNIQUE   约束可以:     
        
      作为表定义的一部分在创建表时创建。   
        
        
      如果组成   UNIQUE   约束的列或列组合只包含唯一值或   NULL   值,则可向现有表添加   UNIQUE   约束。一个表可含有多个   UNIQUE   约束。   
        
      

  4.   


    我觉得userName也是唯一的,为什么不作为主键??
    不是唯一值就要建立主键的
    主键的条件还要是整型的
    所以要用到UNIQUE  这样说明白了把
      

  5.   

    首先,userName可能有重复,这是允许的(我说得的是可能)
    而主键不允许重复,这时用自增型的ID作主键就是必然的了其次,主键由于关系重大,需要与其他表进行关联,所以它的数据不能随意变化,ID满足这个要求,而userName不满足这个要求,因为它可以随意变化
      

  6.   


    主键的条件还要是整型的???这可是你说的,我还是第一次听到这样的说法,你老可是外星人吧,你不做microsoft的CEO也太屈才了吧
      

  7.   


    username可以作为主键的,从数据库的角度上来说是可以的。但是有时加id列与对数据的使用方式有关。
      

  8.   

    用ID作主键,好处有:
    1.ID通常用int,bigint型,在相同的条件下,计算机处理起来比char,varchar等类型效率要高。
    2.ID作为其它表外键的参考值,平时在维护过程中更加方便。比如说用NAME作主键,到某一天时发个有个NAME当时输错了,想改就很麻烦了,而用ID作为主键,就不影响了,你想改就改,只要你有修改权就行了。
    3.主键不允许有重复值,ID设为自增列属性后永远不会重复,而NAME则有可能重复,相比之下更加灵活。
      

  9.   

    用id考虑一下几个原因:
    1.查询搜索速度快,特别是当有很多用户的时候。
    2.方便修改,当其他表有对用户表的引用的时候,只要引用ID就好,修改方便
    3。ID占的物理存储空间要小,这样,其他表引用的时候可以降低物理存储空间
      

  10.   

    如果你的username能保证唯一,我认为可以不需要ID列.既然你这个表是管理员表,应该名字不存在重复,且记录也不会有多少,完全可以不要ID列.
      

  11.   

    --没有人会用userName做主键的。
    1、userName出现重复怎么办?
    2、改名了怎么办?
    3、id为主键并为自增属性这是目前非常通用的一种方式。
      

  12.   

    username是本能作为主键的,不敢保证每个数据的username都是唯一的
    ID自增是为了方便于查找吧
      

  13.   

    create table tb (ID int ,[name ]varchar(10) unique)
    alter table tb
    add constraint qu unique([name])
      

  14.   

    主键不仅要求唯一,还要求不能随意改变,所以Username不适合做主键
      

  15.   

    1.方便数据查询,比如:分页,排序。
    2.方便数据之间关联。userName可能会更新,而导致其他关联表数据不对应更新。
    3.效率高。
    4.id长度较短,占用空间小。
    5.考虑以后系统的扩展和维护。以上是对数据量大,访问频繁的表有以上优点。如果是管理员表,数据量可能只有几十条纪录就无所谓了。
      

  16.   

    如果不用username作为主键,例如一张其他的表要以username作为外键怎么办列?不以username做主键怎么能实现表间的同步更新列?呵呵
      

  17.   


    外键不连username,连ID就可以了, 用ID找回username, 你把username改了, 外部自然也改了表A
    UserID        P KEY
    USERNAME表B
    FormID
    UserID       F KEY
      

  18.   

    userName可以作为主键,关键是看你的需要怎样,数据一致性怎样维护,自动增加的ID字段有时没有多大意思,仅仅想知道记录号而已...
      

  19.   

    支持。
    还有检索时 int类型要比字符型速度快
      

  20.   

    各有千秋,上面的都说了很多了
    接下分....hehe