社区
MS-SQL Server
帖子详情
高手帮忙给个建议,数据表主键到底使用 IDENTITY(int, 1,1) 还是 nvarchar 等其它类型的问题
暗石绿
2005-01-04 07:00:01
我们公司现在分两派,
一派说应该使用sql server 自带的自增标识列。
一派说应该使用nvarchar类型作为主键列。
前者认为自增列查询速度快,不怕重复,保证其唯一性。
后者认为 nvarchar ....
请高手发表一下意见。
...全文
269
12
打赏
收藏
高手帮忙给个建议,数据表主键到底使用 IDENTITY(int, 1,1) 还是 nvarchar 等其它类型的问题
我们公司现在分两派, 一派说应该使用sql server 自带的自增标识列。 一派说应该使用nvarchar类型作为主键列。 前者认为自增列查询速度快,不怕重复,保证其唯一性。 后者认为 nvarchar .... 请高手发表一下意见。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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的特性,可以加快查询速度外,还有重要的一点是保证数据完整性
所有具体使用什么样的列做主键是需要具体问题具体分析的
图书管理系统数据库表设计.docx
1管理员表(L_Administrator) 字段名 字段说明 数据
类型
约束 备注 a_id 管理员编号
int
Primary Key
Identity
(1000,1) a_name 管理员姓名 n
varchar
(20) Not null a_pwd 管理员密码
varchar
(20) Not Null 2读者表(L_Reader) 字段名 字段说明 数据
类型
约束 备注 r_id 读者编号
int
Primary Key r_name 读者姓名 n
varchar
(20) Not Null r_pwd 读者密码
varchar
(20) Not Null r_sex 读者性别 bit Not Null r_typeid 职务
类型
int
Foreign Key 职务
类型
表的
主键
r_academy 所在院系 n
Varchar
(20) r_major 专业 n
Varchar
(20) r_contact 联系方式
Varchar
(20) r_email 邮箱 n
varchar
(20) r_photo 读者照片 n
Varchar
(100) 存的是读者照片的路径 3职务
类型
表(L_Duty) 字段名 字段说明 数据
类型
约束 备注 d_id 职务编号
int
Primary Key
Identity
(1000,1) d_name 职务名称 n
varchar
(20) Not null d_maxcount 最大借阅数量 tiny
int
Not Null 图书管理系统数据库表设计全文共3页,当前为第1页。4图书信息表(L_Book) 图书管理系统数据库表设计全文共3页,当前为第1页。 字段名 字段说明 数据
类型
约束 备注 b_id 图书编号
Varchar
(30) Primary Key b_name 图书名称 n
varchar
(30) Not Null ISBN 国际标准图书编码 char(13) Foreign Key 13位数字组成 b_bkcaseid 书架编号
Varchar
(20) b_price 定价 Numeric(10,2) b_author 作者 n
varchar
(20) b_typeid
类型
编号
int
Foreign Key b_
int
ime 入库时间 DataTime b_synopsis 图书简介 N
varchar
(500) b_state 图书状态 bit 0--借出,1--没有借出 b_photo 封面图片 N
varchar
(100) 存的是路径 5图书
类型
表(L_BookType) 字段名 字段说明 数据
类型
约束 备注 bt_id
类型
编号
int
Primary Key
Identity
(1000,1) bt_name
类型
名称 n
Varchar
(20) Not null 6出版社信息表(L_Publishing) 字段名 字段说明 数据
类型
约束 备注 ISBN 国际标准图书编码 char(13) Primary Key p_name 出版社名称 n
varchar
(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 资源名称 n
Varchar
(30) Not null rs_synopsis 资源简介 n
Varchar
(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
图书管理系统数据库表设计(1).docx
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 管理员姓名 n
varchar
(20) Not null a_pwd 管理员密码
varchar
(20) Not Null 2读者表(L_Reader) 字段名 字段说明 数据
类型
约束 备注 r_id 读者编号
int
Primary Key r_name 读者姓名 n
varchar
(20) Not Null r_pwd 读者密码
varchar
(20) Not Null r_sex 读者性别 bit Not Null r_typeid 职务
类型
int
Foreign Key 职务
类型
表的
主键
r_academy 所在院系 n
Varchar
(20) r_major 专业 n
Varchar
(20) r_contact 联系方式
Varchar
(20) r_email 邮箱 n
varchar
(20) r_photo 读者照片 n
Varchar
(100) 存的是读者照片的路径 3职务
类型
表(L_Duty) 字段名 字段说明 数据
类型
约束 备注 d_id 职务编号
int
Primary Key
Identity
(1000,1) d_name 职务名称 n
varchar
(20) Not null d_maxcount 最大借阅数量 tiny
int
Not Null 图书管理系统数据库表设计(1)全文共4页,当前为第2页。4图书信息表(L_Book) 图书管理系统数据库表设计(1)全文共4页,当前为第2页。 字段名 字段说明 数据
类型
约束 备注 b_id 图书编号
Varchar
(30) Primary Key b_name 图书名称 n
varchar
(30) Not Null ISBN 国际标准图书编码 char(13) Foreign Key 13位数字组成 b_bkcaseid 书架编号
Varchar
(20) b_price 定价 Numeric(10,2) b_author 作者 n
varchar
(20) b_typeid
类型
编号
int
Foreign Key b_
int
ime 入库时间 DataTime b_synopsis 图书简介 N
varchar
(500) b_state 图书状态 bit 0--借出,1--没有借出 b_photo 封面图片 N
varchar
(100) 存的是路径 5图书
类型
表(L_BookType) 字段名 字段说明 数据
类型
约束 备注 bt_id
类型
编号
int
Primary Key
Identity
(1000,1) bt_name
类型
名称 n
Varchar
(20) Not null 6出版社信息表(L_Publishing) 字段名 字段说明 数据
类型
约束 备注 ISBN 国际标准图书编码 char(13) Primary Key p_name 出版社名称 n
varchar
(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 资源名称 n
Varchar
(30) Not null rs_synopsis 资源简介 n
Varchar
(500) rs
图书管理系统--创建数据库和表(1).doc
/* 1管理员表(L_Administrator) 字段名 字段说明 数据
类型
约束 备注 a_id 管理员编号
int
Primary Key
Identity
(1000,1) a_name 管理员姓名 n
varchar
(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 n
varchar
(20) not null, a_pwd
varchar
(20) not null); /* 2职务
类型
表(L_Duty) 字段名 字段说明 数据
类型
约束 备注 d_id 职务编号
int
Primary Key
Identity
(1000,1) d_name 职务名称 n
varchar
(20) Not null d_maxcount 最大借阅数量 tiny
int
Not Null */ use Library go create table L_Duty( d_id
int
not null primary key
Identity
(1000,1), d_name n
varchar
(20) not null, d_maxcount tiny
int
not null); /* 3读者表(L_Reader) 字段名 字段说明 数据
类型
约束 备注 r_id 读者编号 big
int
Primary Key r_name 读者姓名 n
varchar
(20) Not Null r_pwd 读者密码
varchar
(20) Not Null r_sex 读者性别 bit Not Null r_typeid 职务
类型
int
Foreign Key 职务
类型
表的
主键
r_academy 所在院系 n
Varchar
(20) r_major 专业 n
Varchar
(20) r_contact 联系方式
Varchar
(20) r_email 邮箱 n
varchar
(20) r_photo 读者照片 n
Varchar
(100) 存的是读者照片的路径 */ use Library go create table L_Reader( r_id big
int
not null primary key, r_name n
varchar
(20) not null, r_pwd
varchar
(20) not null, r_sex bit not null, r_typeid
int
not null, r_academy n
varchar
(20), r_major n
varchar
(20), r_contact
varchar
(20), r_email
varchar
(20), r_photo n
varchar
(100)); alter table L_Reader add constra
int
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 big
int
, @r_name n
varchar
(20), @r_pwd
varchar
(20), @r_sex bit, @r_typeid
int
, @r_academy n
varchar
(20), @r_major n
varchar
(20), @r_contact
varchar
(20), @r_email
varchar
(20), @r_photo n
varchar
(100) as begin insert
int
o 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
类型
名称 n
Varchar
(20) Not null */ use Library go create table L_BookType( bt_id i
图书管理系统--创建数据库和表.doc
/* 1管理员表(L_Administrator) 字段名 字段说明 数据
类型
约束 备注 a_id 管理员编号
int
Primary Key
Identity
(1000,1) a_name 管理员姓名 n
varchar
(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 n
varchar
(20) not null, a_pwd
varchar
(20) not null); /* 2职务
类型
表(L_Duty) 字段名 字段说明 数据
类型
约束 备注 d_id 职务编号
int
Primary Key
Identity
(1000,1) d_name 职务名称 n
varchar
(20) Not null d_maxcount 最大借阅数量 tiny
int
Not Null */ use Library go create table L_Duty( d_id
int
not null primary key
Identity
(1000,1), d_name n
varchar
(20) not null, d_maxcount tiny
int
not null); /* 3读者表(L_Reader) 字段名 字段说明 数据
类型
约束 备注 r_id 读者编号 big
int
Primary Key r_name 读者姓名 n
varchar
(20) Not Null r_pwd 读者密码
varchar
(20) Not Null r_sex 读者性别 bit Not Null r_typeid 职务
类型
int
Foreign Key 职务
类型
表的
主键
r_academy 所在院系 n
Varchar
(20) r_major 专业 n
Varchar
(20) r_contact 联系方式
Varchar
(20) r_email n
varchar
(20) r_photo 读者照片 n
Varchar
(100) 存的是读者照片的路径 */ use Library go create table L_Reader( r_id big
int
not null primary key, r_name n
varchar
(20) not null, r_pwd
varchar
(20) not null, r_sex bit not null, r_typeid
int
not null, r_academy n
varchar
(20), r_major n
varchar
(20), r_contact
varchar
(20), r_email
varchar
(20), r_photo n
varchar
(100)); alter table L_Reader add constra
int
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 big
int
, r_name n
varchar
(20), r_pwd
varchar
(20), r_sex bit, r_typeid
int
, r_academy n
varchar
(20), r_major n
varchar
(20), r_contact
varchar
(20), r_email
varchar
(20), r_photo n
varchar
(100) as begin insert
int
o 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
类型
名称 n
Varchar
(20) Not null */ use Library go create table L_BookType( bt_id
int
not null primary key
图书管理系统--数据库表设计.doc
1管理员表(L_Administrator) "字段名 "字段说明 "数据
类型
"约束 "备注 " "a_id "管理员编号 "
int
"Primary "
Identity
(1000" " " " "Key ",1) " "a_name "管理员姓名 "n
varchar
(20) "Not null " " "a_pwd "管理员密码 "
varchar
(20) "Not Null " " 2读者表(L_Reader) "字段名 "字段说明 "数据
类型
"约束 "备注 " "r_id "读者编号 "
int
"Primary Key " " "r_name "读者姓名 "n
varchar
(20)"Not Null " " "r_pwd "读者密码 "
varchar
(20) "Not Null " " "r_sex "读者性别 "bit "Not Null " " "r_typeid "职务
类型
"
int
"Foreign Key "职务
类型
表的" " " " " "
主键
" "r_academy "所在院系 "n
Varchar
(20)" " " "r_major "专业 "n
Varchar
(20)" " " "r_contact "联系方式 "
Varchar
(20) " " " "r_email "邮箱 "n
varchar
(20)" " " "r_photo "读者照片 "n
Varchar
(100" "存的是读者照" " " ") " "片的路径 " 3职务
类型
表(L_Duty) "字段名 "字段说明 "数据
类型
"约束 "备注 " "d_id "职务编号 "
int
"Primary "
Identity
(1000,1" " " " "Key ") " "d_name "职务名称 "n
varchar
(20"Not null " " " " ") " " " "d_maxcount"最大借阅数量"tiny
int
"Not Null " " 4图书信息表(L_Book) "字段名 "字段说明 "数据
类型
"约束 "备注 " "b_id "图书编号 "
Varchar
(30) "Primary Key " " "b_name "图书名称 "n
varchar
(30)"Not Null " " "ISBN "国际标准图书编"char(13) "Foreign Key "13位数字组成" " "码 " " " " "b_bkcasei"书架编号 "
Varchar
(20) " " " "d " " " " " "b_price "定价 "Numeric(10,2" " " " " ") " " " "b_author "作者 "n
varchar
(20)" " " "b_typeid "
类型
编号 "
int
"Foreign Key " " "b_
int
ime "入库时间 "DataTime " " " "b_synopsi"图书简介 "N
varchar
(500" " " "s " ") " " " "b_state "图书状态 "bit " "0--借出,1--" " " " " "没有借出 " "b_photo "封面图片 "N
varchar
(100" "存的是路径 " " " ") " " " 5图书
类型
表(L_BookType) "字段名 "字段说明 "数据
类型
"约束 "备注 " "bt_id "
类型
编号 "
int
"Primary "
Identity
(1000" " " " "Key ",1) " "bt_name "
类型
名称 "n
Varchar
(20)"Not null " " 6出版社信息表(L_Publishing) "字段名 "字段说明 "数据
类型
"约束 "备注 " "ISBN "国际标准图书编"char(13) "Primary Key " " " "码 " " " " "p_name "出版社名称 "n
varchar
(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 "默认
MS-SQL Server
34,590
社区成员
254,589
社区内容
发帖
与我相关
我的任务
MS-SQL Server
MS-SQL Server相关内容讨论专区
复制链接
扫一扫
分享
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章