新手问个简单的问题(答者有分) 一个管理员的表中有三个属性,id、userName、password.id为主键并为自增属性,我觉得userName也是唯一的,为什么不作为主键,而需要多设一个id自增属性的作用 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 如果就这个表而言,username是唯一的话,它是可以作为主键的但是往往这种的主键会是另一个表的外键,当usename修改时,则需要修改两个表的信息,否则会出现更新异常,导致两个表的信息不一致。 原因很多啊:1:即使userName是唯一的,建立了主键,那么你将来要像对记录进行排序,对哪个字段排呢?对userName吗?这是字符型的,排序的结果往往是根据字母表的顺序。2:如果你想唯一确定一条记录,通过userName当然可以,但是最关键的是假如你有100万的记录,你想列表出所有用户,你就必须对表分页查询,那么我问你:难道你的分页依据是userName吗?这是最重要的。3:如果你有1000万条记录呢?你像查询出某个记录的话,你难道通过userName的主键或者这个唯一性索引来查找吗?这样还是很慢的,那么你要分区!分区的依据是什么?!userName是字符型的,不能分区字段的。必须是INT或者其它INT类型的,那么就需要一个ID了。这些原因够有说服力了吧? 你可以用约束create table tb (ID int ,[name ]varchar(10) unique)alter table tbadd 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 约束。 我觉得userName也是唯一的,为什么不作为主键??不是唯一值就要建立主键的主键的条件还要是整型的所以要用到UNIQUE 这样说明白了把 首先,userName可能有重复,这是允许的(我说得的是可能)而主键不允许重复,这时用自增型的ID作主键就是必然的了其次,主键由于关系重大,需要与其他表进行关联,所以它的数据不能随意变化,ID满足这个要求,而userName不满足这个要求,因为它可以随意变化 主键的条件还要是整型的???这可是你说的,我还是第一次听到这样的说法,你老可是外星人吧,你不做microsoft的CEO也太屈才了吧 username可以作为主键的,从数据库的角度上来说是可以的。但是有时加id列与对数据的使用方式有关。 用ID作主键,好处有:1.ID通常用int,bigint型,在相同的条件下,计算机处理起来比char,varchar等类型效率要高。2.ID作为其它表外键的参考值,平时在维护过程中更加方便。比如说用NAME作主键,到某一天时发个有个NAME当时输错了,想改就很麻烦了,而用ID作为主键,就不影响了,你想改就改,只要你有修改权就行了。3.主键不允许有重复值,ID设为自增列属性后永远不会重复,而NAME则有可能重复,相比之下更加灵活。 用id考虑一下几个原因:1.查询搜索速度快,特别是当有很多用户的时候。2.方便修改,当其他表有对用户表的引用的时候,只要引用ID就好,修改方便3。ID占的物理存储空间要小,这样,其他表引用的时候可以降低物理存储空间 如果你的username能保证唯一,我认为可以不需要ID列.既然你这个表是管理员表,应该名字不存在重复,且记录也不会有多少,完全可以不要ID列. --没有人会用userName做主键的。1、userName出现重复怎么办?2、改名了怎么办?3、id为主键并为自增属性这是目前非常通用的一种方式。 username是本能作为主键的,不敢保证每个数据的username都是唯一的ID自增是为了方便于查找吧 create table tb (ID int ,[name ]varchar(10) unique)alter table tbadd constraint qu unique([name]) 主键不仅要求唯一,还要求不能随意改变,所以Username不适合做主键 1.方便数据查询,比如:分页,排序。2.方便数据之间关联。userName可能会更新,而导致其他关联表数据不对应更新。3.效率高。4.id长度较短,占用空间小。5.考虑以后系统的扩展和维护。以上是对数据量大,访问频繁的表有以上优点。如果是管理员表,数据量可能只有几十条纪录就无所谓了。 如果不用username作为主键,例如一张其他的表要以username作为外键怎么办列?不以username做主键怎么能实现表间的同步更新列?呵呵 外键不连username,连ID就可以了, 用ID找回username, 你把username改了, 外部自然也改了表AUserID P KEYUSERNAME表BFormIDUserID F KEY userName可以作为主键,关键是看你的需要怎样,数据一致性怎样维护,自动增加的ID字段有时没有多大意思,仅仅想知道记录号而已... 支持。还有检索时 int类型要比字符型速度快 各有千秋,上面的都说了很多了接下分....hehe SQL Server的master数据库是干什么的? 在线等::将某一字段的值修改为该值减去根据查询得到的值 Select 中统计总数的问题 数据库恢复出错 急急急!!!帮忙看看 odbc数据源管理器变成繁体,如何转换成简体? 编号问题 MSSQL导出到EXCEL 在线等,着急 怎样用存储过程存图片 SQL统计数据表的时间,大神帮忙解决下 数据库如何设置多个主键(SQL2000) 关于SQL SERVER数据库安全设置的检测
否则会出现更新异常,导致两个表的信息不一致。
1:即使userName是唯一的,建立了主键,那么你将来要像对记录进行排序,对哪个字段排呢?对userName吗?这是字符型的,排序的结果往往是根据字母表的顺序。
2:如果你想唯一确定一条记录,通过userName当然可以,但是最关键的是假如你有100万的记录,你想列表出所有用户,
你就必须对表分页查询,那么我问你:难道你的分页依据是userName吗?这是最重要的。
3:如果你有1000万条记录呢?你像查询出某个记录的话,你难道通过userName的主键或者这个唯一性索引来查找吗?
这样还是很慢的,那么你要分区!分区的依据是什么?!userName是字符型的,不能分区字段的。必须是INT或者其它INT类型的,那么就需要一个ID了。
这些原因够有说服力了吧?
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 约束。
我觉得userName也是唯一的,为什么不作为主键??
不是唯一值就要建立主键的
主键的条件还要是整型的
所以要用到UNIQUE 这样说明白了把
而主键不允许重复,这时用自增型的ID作主键就是必然的了其次,主键由于关系重大,需要与其他表进行关联,所以它的数据不能随意变化,ID满足这个要求,而userName不满足这个要求,因为它可以随意变化
主键的条件还要是整型的???这可是你说的,我还是第一次听到这样的说法,你老可是外星人吧,你不做microsoft的CEO也太屈才了吧
username可以作为主键的,从数据库的角度上来说是可以的。但是有时加id列与对数据的使用方式有关。
1.ID通常用int,bigint型,在相同的条件下,计算机处理起来比char,varchar等类型效率要高。
2.ID作为其它表外键的参考值,平时在维护过程中更加方便。比如说用NAME作主键,到某一天时发个有个NAME当时输错了,想改就很麻烦了,而用ID作为主键,就不影响了,你想改就改,只要你有修改权就行了。
3.主键不允许有重复值,ID设为自增列属性后永远不会重复,而NAME则有可能重复,相比之下更加灵活。
1.查询搜索速度快,特别是当有很多用户的时候。
2.方便修改,当其他表有对用户表的引用的时候,只要引用ID就好,修改方便
3。ID占的物理存储空间要小,这样,其他表引用的时候可以降低物理存储空间
1、userName出现重复怎么办?
2、改名了怎么办?
3、id为主键并为自增属性这是目前非常通用的一种方式。
ID自增是为了方便于查找吧
alter table tb
add constraint qu unique([name])
2.方便数据之间关联。userName可能会更新,而导致其他关联表数据不对应更新。
3.效率高。
4.id长度较短,占用空间小。
5.考虑以后系统的扩展和维护。以上是对数据量大,访问频繁的表有以上优点。如果是管理员表,数据量可能只有几十条纪录就无所谓了。
外键不连username,连ID就可以了, 用ID找回username, 你把username改了, 外部自然也改了表A
UserID P KEY
USERNAME表B
FormID
UserID F KEY
还有检索时 int类型要比字符型速度快
接下分....hehe