高手帮忙给个建议,数据表主键到底使用 IDENTITY(int, 1,1) 还是 nvarchar 等其它类型的问题

暗石绿 2005-01-04 07:00:01
我们公司现在分两派,
一派说应该使用sql server 自带的自增标识列。
一派说应该使用nvarchar类型作为主键列。

前者认为自增列查询速度快,不怕重复,保证其唯一性。
后者认为 nvarchar ....


请高手发表一下意见。
...全文
269 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
lousidao 2005-01-10
  • 打赏
  • 举报
回复
up
暗石绿 2005-01-10
  • 打赏
  • 举报
回复
???
guid 作主键?
ylh1223 2005-01-10
  • 打赏
  • 举报
回复
用guid作主键
子陌红尘 2005-01-05
  • 打赏
  • 举报
回复
简单模式下,一般用identity来维护数据的唯一性,但是在复杂的环境和需求下,如didoleo(冷月无声) 所言,是否还适合使用自增字段是值得商榷的。
暗石绿 2005-01-05
  • 打赏
  • 举报
回复
你们一般是怎么使用的呢?
用自增列多?还是用别的数据类型作主键的多?
Fibona 2005-01-04
  • 打赏
  • 举报
回复
用自增的indentity做主键吧.
didoleo 2005-01-04
  • 打赏
  • 举报
回复
其次,到底主键有什么功能?

1.实现实体完整性约束,确保不会出现重复;
2.在参照完整性中充当被参照对象,需要与外键进行连接,当然从优化角度出发也需要排序了;
3.在编程建立业务实体对象时,是一个很好的检索出发点;
4.在删除、更新操作时可以出现在WHERE短语中表示操作的对象(显然又会进行检索)。

考虑到底用自增列还是用nvarchar来做你的主键,那楼主看看他们各自能不能满足以上这些要求.
didoleo 2005-01-04
  • 打赏
  • 举报
回复
这真是一永远也讨论不完的话题:

很多数据库设计者喜欢使用自动增长型字段,因为它使用简单。自动增长型字段允许我们在向数据库添加数据时,不考虑主键的取值,记录插入后,数据库系统会自动为其分配一个值,确保绝对不会出现重复。如果使用SQL Server数据库的话,我们还可以在记录插入后使用@@IDENTITY全局变量获取系统分配的主键键值。

尽管自动增长型字段会省掉我们很多繁琐的工作,但使用它也存在潜在的问题,那就是在数据缓冲模式下,很难预先填写主键与外键的值。假设有两张表:

Order(OrderID, OrderDate)
OrderDetial(OrderID, LineNum, ProductID, Price)

Order表中的OrderID是自动增长型的字段。现在需要我们录入一张订单,包括在Order表中插入一条记录以及在OrderDetail表中插入若干条记录。因为Order表中的OrderID是自动增长型的字段,那么我们在记录正式插入到数据库之前无法事先得知它的取值,只有在更新后才能知道数据库为它分配的是什么值。这会造成以下矛盾发生:

首先,为了能在OrderDetail的OrderID字段中添入正确的值,必须先更新Order表以获取到系统为其分配的OrderID值,然后再用这个OrderID填充OrderDetail表。最后更新OderDetail表。但是,为了确保数据的一致性,Order与OrderDetail在更新时必须在事务保护下同时进行,即确保两表同时更行成功。显然它们是相互矛盾的。

除此之外,当我们需要在多个数据库间进行数据的复制时(SQL Server的数据分发、订阅机制允许我们进行库间的数据复制操作),自动增长型字段可能造成数据合并时的主键冲突。设想一个数据库中的Order表向另一个库中的Order表复制数据库时,OrderID到底该不该自动增长呢?

暗石绿 2005-01-04
  • 打赏
  • 举报
回复
按我的认为,除非是特殊考虑,才用非 自增列。
常规都使用自增列。
chinaandys 2005-01-04
  • 打赏
  • 举报
回复
具体情况,具体对待

如:数据量小,可用Identity

而查询速度主要取决于你的索引、查询语句的优化、硬件性能等等

请楼下高手指点。。。
NinGoo 2005-01-04
  • 打赏
  • 举报
回复
例如表A使用ID列做主键,表B使用ID参考表A的ID列设置外键
那么这个ID列是使用什么类型的列重要是根据数据完整性来设计,而不是根据是自增列还是nvarchar列来设计的
NinGoo 2005-01-04
  • 打赏
  • 举报
回复
主键除了有index的特性,可以加快查询速度外,还有重要的一点是保证数据完整性

所有具体使用什么样的列做主键是需要具体问题具体分析的
1管理员表(L_Administrator) 字段名 字段说明 数据类型 约束 备注 a_id 管理员编号 int Primary Key Identity(1000,1) a_name 管理员姓名 nvarchar(20) Not null a_pwd 管理员密码 varchar(20) Not Null 2读者表(L_Reader) 字段名 字段说明 数据类型 约束 备注 r_id 读者编号 int Primary Key r_name 读者姓名 nvarchar(20) Not Null r_pwd 读者密码 varchar(20) Not Null r_sex 读者性别 bit Not Null r_typeid 职务类型 int Foreign Key 职务类型表的主键 r_academy 所在院系 nVarchar(20) r_major 专业 nVarchar(20) r_contact 联系方式 Varchar(20) r_email 邮箱 nvarchar(20) r_photo 读者照片 nVarchar(100) 存的是读者照片的路径 3职务类型表(L_Duty) 字段名 字段说明 数据类型 约束 备注 d_id 职务编号 int Primary Key Identity(1000,1) d_name 职务名称 nvarchar(20) Not null d_maxcount 最大借阅数量 tinyint Not Null 图书管理系统数据库表设计全文共3页,当前为第1页。4图书信息表(L_Book) 图书管理系统数据库表设计全文共3页,当前为第1页。 字段名 字段说明 数据类型 约束 备注 b_id 图书编号 Varchar(30) Primary Key b_name 图书名称 nvarchar(30) Not Null ISBN 国际标准图书编码 char(13) Foreign Key 13位数字组成 b_bkcaseid 书架编号 Varchar(20) b_price 定价 Numeric(10,2) b_author 作者 nvarchar(20) b_typeid 类型编号 int Foreign Key b_intime 入库时间 DataTime b_synopsis 图书简介 Nvarchar(500) b_state 图书状态 bit 0--借出,1--没有借出 b_photo 封面图片 Nvarchar(100) 存的是路径 5图书类型表(L_BookType) 字段名 字段说明 数据类型 约束 备注 bt_id 类型编号 int Primary Key Identity(1000,1) bt_name 类型名称 nVarchar(20) Not null 6出版社信息表(L_Publishing) 字段名 字段说明 数据类型 约束 备注 ISBN 国际标准图书编码 char(13) Primary Key p_name 出版社名称 nvarchar(30) Not Null 7借阅管理表(L_Borrow) 字段名 字段说明 数据类型 约束 备注 bw_id 借阅编号 int Primary Key Identity(1,1) bw_bookid 图书编号 Varchar(30) Foreign Key bw_readerid 读者编号 Int Foreign Key bw_outtime 借出日期 DateTime Not Null bw_endtime 到期日期 DateTime Not Null bw_backtime 归还日期 DateTime bw_isexpired 是否过期 Bit Not Null 默认为0--不过期 bw_fine 罚款数目 Numeric (10,2) 过期后才计算罚款数目 8图书资源表(L_Resource) 字段名 字段说明 数据类型 约束 备注 rs_id 资源编号 Int Primary Key Identity(1000,1) rs_name 资源名称 nVarchar(30) Not null rs_synopsis 资源简介 nVarchar(500) rs_amount 资源大小 int 单位为KB或是MB rs_type 资源类型 Varchar(20) 类似于doc、xsl、ppt、pdf、zip、rar、MP3、wmv等常用格式 图书管理系统数据库表设计全文共3页,当前为第2页。9图书评论表(L_BookMarks) 图书管理系统数据库表设计全文共3页,当前为第2页。 字段名 字段说明 数据类型 约束 备注 ISBN 国际标准图书编码 char(13) Foreign Key bm_contents 评论内容 Nvar
WTD standardization office【WTD 5AB- WTDK 08- WTD 2C】 WTD standardization office【WTD 5AB- WTDK 08- WTD 2C】 图书管理系统数据库表设计(1)全文共4页,当前为第1页。图书管理系统数据库表设计 图书管理系统数据库表设计(1)全文共4页,当前为第1页。 1管理员表(L_Administrator) 字段名 字段说明 数据类型 约束 备注 a_id 管理员编号 int Primary Key Identity(1000,1) a_name 管理员姓名 nvarchar(20) Not null a_pwd 管理员密码 varchar(20) Not Null 2读者表(L_Reader) 字段名 字段说明 数据类型 约束 备注 r_id 读者编号 int Primary Key r_name 读者姓名 nvarchar(20) Not Null r_pwd 读者密码 varchar(20) Not Null r_sex 读者性别 bit Not Null r_typeid 职务类型 int Foreign Key 职务类型表的主键 r_academy 所在院系 nVarchar(20) r_major 专业 nVarchar(20) r_contact 联系方式 Varchar(20) r_email 邮箱 nvarchar(20) r_photo 读者照片 nVarchar(100) 存的是读者照片的路径 3职务类型表(L_Duty) 字段名 字段说明 数据类型 约束 备注 d_id 职务编号 int Primary Key Identity(1000,1) d_name 职务名称 nvarchar(20) Not null d_maxcount 最大借阅数量 tinyint Not Null 图书管理系统数据库表设计(1)全文共4页,当前为第2页。4图书信息表(L_Book) 图书管理系统数据库表设计(1)全文共4页,当前为第2页。 字段名 字段说明 数据类型 约束 备注 b_id 图书编号 Varchar(30) Primary Key b_name 图书名称 nvarchar(30) Not Null ISBN 国际标准图书编码 char(13) Foreign Key 13位数字组成 b_bkcaseid 书架编号 Varchar(20) b_price 定价 Numeric(10,2) b_author 作者 nvarchar(20) b_typeid 类型编号 int Foreign Key b_intime 入库时间 DataTime b_synopsis 图书简介 Nvarchar(500) b_state 图书状态 bit 0--借出,1--没有借出 b_photo 封面图片 Nvarchar(100) 存的是路径 5图书类型表(L_BookType) 字段名 字段说明 数据类型 约束 备注 bt_id 类型编号 int Primary Key Identity(1000,1) bt_name 类型名称 nVarchar(20) Not null 6出版社信息表(L_Publishing) 字段名 字段说明 数据类型 约束 备注 ISBN 国际标准图书编码 char(13) Primary Key p_name 出版社名称 nvarchar(30) Not Null 7借阅管理表(L_Borrow) 字段名 字段说明 数据类型 约束 备注 bw_id 借阅编号 int Primary Key Identity(1,1) bw_bookid 图书编号 Varchar(30) Foreign Key bw_readerid 读者编号 Int Foreign Key bw_outtime 借出日期 DateTime Not Null bw_endtime 到期日期 DateTime Not Null bw_backtime 归还日期 DateTime bw_isexpired 是否过期 Bit Not Null 默认为0--不过期 bw_fine 罚款数目 Numeric (10,2) 过期后才计算罚款数目 图书管理系统数据库表设计(1)全文共4页,当前为第3页。8图书资源表(L_Resource) 图书管理系统数据库表设计(1)全文共4页,当前为第3页。 字段名 字段说明 数据类型 约束 备注 rs_id 资源编号 Int Primary Key Identity(1000,1) rs_name 资源名称 nVarchar(30) Not null rs_synopsis 资源简介 nVarchar(500) rs
/* 1管理员表(L_Administrator) 字段名 字段说明 数据类型 约束 备注 a_id 管理员编号 int Primary Key Identity(1000,1) a_name 管理员姓名 nvarchar(20) Not null a_pwd 管理员密码 varchar(20) Not Null */ use Library go create table L_Administrator( a_id int not null primary key Identity(1000,1), a_name nvarchar(20) not null, a_pwd varchar(20) not null); /* 2职务类型表(L_Duty) 字段名 字段说明 数据类型 约束 备注 d_id 职务编号 int Primary Key Identity(1000,1) d_name 职务名称 nvarchar(20) Not null d_maxcount 最大借阅数量 tinyint Not Null */ use Library go create table L_Duty( d_id int not null primary key Identity(1000,1), d_name nvarchar(20) not null, d_maxcount tinyint not null); /* 3读者表(L_Reader) 字段名 字段说明 数据类型 约束 备注 r_id 读者编号 bigint Primary Key r_name 读者姓名 nvarchar(20) Not Null r_pwd 读者密码 varchar(20) Not Null r_sex 读者性别 bit Not Null r_typeid 职务类型 int Foreign Key 职务类型表的主键 r_academy 所在院系 nVarchar(20) r_major 专业 nVarchar(20) r_contact 联系方式 Varchar(20) r_email 邮箱 nvarchar(20) r_photo 读者照片 nVarchar(100) 存的是读者照片的路径 */ use Library go create table L_Reader( r_id bigint not null primary key, r_name nvarchar(20) not null, r_pwd varchar(20) not null, r_sex bit not null, r_typeid int not null, r_academy nvarchar(20), r_major nvarchar(20), r_contact varchar(20), r_email varchar(20), r_photo nvarchar(100)); alter table L_Reader add constraint fk_dtypeid foreign key(r_typeid) references L_Duty(d_id) on delete cascade on update cascade; /*创建一个存储过程*/ use Library go create procedure reader @r_id bigint, @r_name nvarchar(20), @r_pwd varchar(20), @r_sex bit, @r_typeid int, @r_academy nvarchar(20), @r_major nvarchar(20), @r_contact varchar(20), @r_email varchar(20), @r_photo nvarchar(100) as begin insert into L_Reader(r_id,r_name,r_pwd,r_sex,r_typeid,r_academy,r_major,r_contact,r_e mail,r_photo) values(@r_id,@r_name,@r_pwd,@r_sex,@r_typeid,@r_academy,@r_major,@r_co ntact,@r_email,@r_photo); end /* 4图书类型表(L_BookType) 字段名 字段说明 数据类型 约束 备注 bt_id 类型编号 int Primary Key Identity(1000,1) bt_name 类型名称 nVarchar(20) Not null */ use Library go create table L_BookType( bt_id i
/* 1管理员表(L_Administrator) 字段名 字段说明 数据类型 约束 备注 a_id 管理员编号 int Primary Key Identity(1000,1) a_name 管理员姓名 nvarchar(20) Not null a_pwd 管理员密码 varchar(20) Not Null */ use Library go create table L_Administrator( a_id int not null primary key Identity(1000,1), a_name nvarchar(20) not null, a_pwd varchar(20) not null); /* 2职务类型表(L_Duty) 字段名 字段说明 数据类型 约束 备注 d_id 职务编号 int Primary Key Identity(1000,1) d_name 职务名称 nvarchar(20) Not null d_maxcount 最大借阅数量 tinyint Not Null */ use Library go create table L_Duty( d_id int not null primary key Identity(1000,1), d_name nvarchar(20) not null, d_maxcount tinyint not null); /* 3读者表(L_Reader) 字段名 字段说明 数据类型 约束 备注 r_id 读者编号 bigint Primary Key r_name 读者姓名 nvarchar(20) Not Null r_pwd 读者密码 varchar(20) Not Null r_sex 读者性别 bit Not Null r_typeid 职务类型 int Foreign Key 职务类型表的主键 r_academy 所在院系 nVarchar(20) r_major 专业 nVarchar(20) r_contact 联系方式 Varchar(20) r_email nvarchar(20) r_photo 读者照片 nVarchar(100) 存的是读者照片的路径 */ use Library go create table L_Reader( r_id bigint not null primary key, r_name nvarchar(20) not null, r_pwd varchar(20) not null, r_sex bit not null, r_typeid int not null, r_academy nvarchar(20), r_major nvarchar(20), r_contact varchar(20), r_email varchar(20), r_photo nvarchar(100)); alter table L_Reader add constraint fk_dtypeid foreign key(r_typeid) references L_Duty(d_id) on delete cascade on update cascade; /*创建一个存储过程*/ use Library go create procedure reader r_id bigint, r_name nvarchar(20), r_pwd varchar(20), r_sex bit, r_typeid int, r_academy nvarchar(20), r_major nvarchar(20), r_contact varchar(20), r_email varchar(20), r_photo nvarchar(100) as begin insert into L_Reader(r_id,r_name,r_pwd,r_sex,r_typeid,r_academy,r_major,r_contact,r_emai l,r_photo) values(r_id,r_name,r_pwd,r_sex,r_typeid,r_academy,r_major,r_contact,r_email, r_photo); end /* 4图书类型表(L_BookType) 字段名 字段说明 数据类型 约束 备注 bt_id 类型编号 int Primary Key Identity(1000,1) bt_name 类型名称 nVarchar(20) Not null */ use Library go create table L_BookType( bt_id int not null primary key
1管理员表(L_Administrator) "字段名 "字段说明 "数据类型 "约束 "备注 " "a_id "管理员编号 "int "Primary "Identity(1000" " " " "Key ",1) " "a_name "管理员姓名 "nvarchar(20) "Not null " " "a_pwd "管理员密码 "varchar(20) "Not Null " " 2读者表(L_Reader) "字段名 "字段说明 "数据类型 "约束 "备注 " "r_id "读者编号 "int "Primary Key " " "r_name "读者姓名 "nvarchar(20)"Not Null " " "r_pwd "读者密码 "varchar(20) "Not Null " " "r_sex "读者性别 "bit "Not Null " " "r_typeid "职务类型 "int "Foreign Key "职务类型表的" " " " " "主键 " "r_academy "所在院系 "nVarchar(20)" " " "r_major "专业 "nVarchar(20)" " " "r_contact "联系方式 "Varchar(20) " " " "r_email "邮箱 "nvarchar(20)" " " "r_photo "读者照片 "nVarchar(100" "存的是读者照" " " ") " "片的路径 " 3职务类型表(L_Duty) "字段名 "字段说明 "数据类型 "约束 "备注 " "d_id "职务编号 "int "Primary "Identity(1000,1" " " " "Key ") " "d_name "职务名称 "nvarchar(20"Not null " " " " ") " " " "d_maxcount"最大借阅数量"tinyint "Not Null " " 4图书信息表(L_Book) "字段名 "字段说明 "数据类型 "约束 "备注 " "b_id "图书编号 "Varchar(30) "Primary Key " " "b_name "图书名称 "nvarchar(30)"Not Null " " "ISBN "国际标准图书编"char(13) "Foreign Key "13位数字组成" " "码 " " " " "b_bkcasei"书架编号 "Varchar(20) " " " "d " " " " " "b_price "定价 "Numeric(10,2" " " " " ") " " " "b_author "作者 "nvarchar(20)" " " "b_typeid "类型编号 "int "Foreign Key " " "b_intime "入库时间 "DataTime " " " "b_synopsi"图书简介 "Nvarchar(500" " " "s " ") " " " "b_state "图书状态 "bit " "0--借出,1--" " " " " "没有借出 " "b_photo "封面图片 "Nvarchar(100" "存的是路径 " " " ") " " " 5图书类型表(L_BookType) "字段名 "字段说明 "数据类型 "约束 "备注 " "bt_id "类型编号 "int "Primary "Identity(1000" " " " "Key ",1) " "bt_name "类型名称 "nVarchar(20)"Not null " " 6出版社信息表(L_Publishing) "字段名 "字段说明 "数据类型 "约束 "备注 " "ISBN "国际标准图书编"char(13) "Primary Key " " " "码 " " " " "p_name "出版社名称 "nvarchar(30)"Not Null " " 7借阅管理表(L_Borrow) "字段名 "字段说明 "数据类型 "约束 "备注 " "bw_id "借阅编号 "int "Primary Key"Identity(1" " " " " ",1) " "bw_bookid "图书编号 "Varchar(30) "Foreign Key" " "bw_readerid "读者编号 "Int "Foreign Key" " "bw_outtime "借出日期 "DateTime "Not Null " " "bw_endtime "到期日期 "DateTime "Not Null " " "bw_backtime "归还日期 "DateTime " " " "bw_isexpired "是否过期 "Bit "Not Null "默认

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧