关于SQL SERVER数据库表主键问题
SQL_Server_2005面试笔试题

SQL Server 2005考试题考试时间90分钟一、选择题(26-30每题2分,其余1分共45分)1)假定有一个用户表,表中包含字段:userid (int)、username (varchar)、 password(varchar)、等,该表需要设置主键,以下说法正确的是()。
(选择两项)a)如果不能有同时重复的username和password,那么username和password可以组合在一起作为主键。
b)此表设计主键时,根据选择主键的最小性原则,最好采用userid作为主键。
c)此表设计主键时,根据选择主键的最小性原则,最好采用username和password作为组合键。
d) 如果采用userid作为主键,那么在userid列输入的数值,允许为空。
2)以下()语句从表TABLE_NAME中提取前10条记录。
(选择一项)a)select * from TABLE_NAME where rowcount=10b)select TOP 10 * from TABLE_NAMEc)select TOP of 10 * from TABLE_NAMEd)select * from TABLE_NAME where rowcount<=103) 从“产品”表里查询出价格高于产品名称为“一次性纸杯”的产品的记录,此SQL语句为()。
(选择一项)a)SELECT * FROM 产品WHERE 价格>‘一次性纸杯’b)SELECT * FROM 产品WHERE 价格>(SELECT * FROM 产品WHERE 产品名称>’ 一次性纸杯’c)SELECT * FROM 产品WHERE EXISTS 产品名称=’ 一次性纸杯’d)SELECT * FROM 产品WHERE 价格>(SELECT 价格FROM 产品WHERE 产品名称=’ 一次性纸杯’4)查找 student表中所有电话号码(列名:telephone)的第一位为8或6,第三位为0的电话号码()。
sqlserver中主键设置应该遵循的原则

sqlserver中主键设置应该遵循的原则在SQL Server中设置主键是非常重要的,它用于唯一标识表中的每一行数据。
在设置主键时,应该遵循以下原则:1.唯一性:主键必须是唯一的,不允许有重复值。
这样可以确保每一行数据都可以被唯一标识。
2.简洁性:主键应该尽量简洁,通常是由一个或几个列组成。
较短的主键可以提高查询性能。
3.不变性:主键值应该是不可变的,即不会随着数据的变化而改变。
这可以保证数据的一致性和完整性。
4.稳定性:主键值应该是稳定的,不会被频繁地修改。
经常修改主键值可能会导致索引的重新构建,影响性能。
5.可读性:主键值可以是人类可读的,以便于理解和维护。
但是,可读性不应成为主键的首要考虑因素。
6.精确性:主键值应该是精确的,即不应该引起歧义。
例如,不应使用不完整的或模糊的数据作为主键。
7.可排序:主键值应该是可排序的,以便于查询和排序操作。
8.高效性:主键应该是高效的,即在查询和连接操作中能够提供较好的性能。
9.非空性:主键值应该是非空的,不允许为空值。
这可以确保主键的完整性和唯一性。
10.单一性:主键应该是单一的,即每个表只能有一个主键。
这可以简化数据的维护和管理。
11.进程性:主键值应该是连续的,而不是断断续续的。
连续的主键值可以提高查询性能。
12.数据类型选择:主键的数据类型应该选择适当的数据类型,例如整数类型、字符类型等。
选择合适的数据类型可以提高查询性能和存储效率。
13.自动增长:主键可以使用自动增长属性,以便在插入新行时自动生成主键值。
自动增长主键可以简化数据插入过程。
14.分布均衡:在分布式数据库中,分片键可以作为分布均衡的主键。
分布均衡可以提高查询性能和负载均衡。
总结来说,设置主键时应该追求唯一性、简洁性、稳定性、精确性、高效性和非空性。
主键的选择应该考虑数据的特点和查询需求,以提高数据库的性能和可维护性。
SQLSERVER数据库表主键类型浅析

SQLSERVER数据库表主键类型浅析
本⽂赞同:
①主键是必需的
②主键应和业务⽆关
③主键是单列的
④⾃记录插⼊后,主键不会被更新
===========================================================
1.⾃动增长的数值类型
即新建⼀个ID字段,⾃动增长。
优点:数字型,占⽤空间⼩,易排序。
数据库⾃动编号,速度快。
增量增长,聚集型主键按顺序存放,有利于检索⾮常。
缺点:⼿动要插⼊指定ID的记录时会显得⿇烦,尤其是当系统与其他系统集成时,需要数据导⼊时,很难保证原系统的ID不发⽣主键冲突。
2.控制增长的字符串类型
是第⼀种⽅案的改进版。
为⽅便以后的数据导⼊,可以⽤字符串类型存储纯数字的主键(纯数字好处不啰嗦)。
⽤⼀张表维护最后插⼊记录的主键,解决max()带来的性能问题,并⽤存储过程为新插⼊的记录⽣成主键。
3.GUID
优势:具有唯⼀性,在任何情况下,可以产⽣全球唯⼀的值,⽅便数据导⼊。
不⾜:结构过长且⽆序,不易记忆,索引的空间⼤,所以检索时间长。
GUID的产⽣不是以⼀定的次序产⽣,对于按主键物理索引的数据库来说,当新的GUID进来时,它会把所有GUID重新排序,这将影响数据插⼊效率。
SQL中的主键和外键

主键与外键一、什么是主键、外键:关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键比如学生表(学号,姓名,性别,班级)其中每个学生的学号是唯一的,学号就是一个主键课程表(课程编号,课程名,学分)其中课程编号是唯一的,课程编号就是一个主键成绩表(学号,课程号,成绩)成绩表中单一一个属性无法唯一标识一条记录,学号和课程号的组合才可以唯一标识一条记录,所以学号和课程号的属性组是一个主键成绩表中的学号不是成绩表的主键,但它和学生表中的学号相对应,并且学生表中的学号是学生表的主键,则称成绩表中的学号是学生表的外键同理成绩表中的课程号是课程表的外键定义主键和外键主要是为了维护关系数据库的完整性,总结一下:主键是能确定一条记录的唯一标识,比如,一条记录包括身份正号,姓名,年龄。
身份证号是唯一能确定你这个人的,其他都可能有重复,所以,身份证号是主键。
外键用于与另一张表的关联。
是能确定另一张表记录的字段,用于保持数据的一致性。
比如,A表中的一个字段,是B表的主键,那他就可以是A表的外键。
二、主键、外键和索引的区别收藏聚集索引和非聚集索引的区别?聚集索引一定是唯一索引。
但唯一索引不一定是聚集索引。
聚集索引,在索引页里直接存放数据,而非聚集索引在索引页里存放的是索引,这些索引指向专门的数据页的数据。
三、数据库中主键和外键的设计原则主键和外键是把多个表组织为一个有效的关系数据库的粘合剂。
主键和外键的设计对物理数据库的性能和可用性都有着决定性的影响。
必须将数据库模式从理论上的逻辑设计转换为实际的物理设计。
而主键和外键的结构是这个设计过程的症结所在。
一旦将所设计的数据库用于了生产环境,就很难对这些键进行修改,所以在开发阶段就设计好主键和外键就是非常必要和值得的。
主键:关系数据库依赖于主键---它是数据库物理模式的基石。
主键在物理层面上只有两个用途:1. 惟一地标识一行。
SQL Server 练习题

SQL Server 练习题一、填空题1.数据库系统的特点分别是数据的结构化、数据共享、数据独立性和可控冗余度。
2.在数据库的表中,主键是指表中的某一列或几列,它的值唯一标识一行。
3.SQL Server 2005的文件包括: 数据文件(.mdf或.ndf)和日志文件。
4.在SQL Server 2005中,要访问某个数据库,除了需要有一个登录帐号外,还必须有一个该数据库的用户帐号。
5. 数据库管理系统,简称DBMS,它是指帮助用户建立、使用和管理数据库的软件系统。
6.在T-SQL语言中,若要修改某张表的结构,应该使用的修改关键字是ALTER;若要创建一个数据库,应该使用的语句是CREA TE DA TABASE。
5.命令Truncate Table的功能是清空数据库。
6.数据完整性是指存储在数据库中的数据的一致性和准确性,,根据完整性机制所作用的数据库对象和范围不同,可以分为:实体完整性、域完整性、参照(或:引用)完整性和用户自定义完整性约束等四种,其中主键可以实现实体完整性。
7.模糊查询符号% 代表任意字符,查询条件e%im 代表意思是查询以 e 开头中间任意字符(串)且以im 结尾的字符串。
8.使用索引可以减少检索时间,根据索引的存储结构不同将其分为两类:簇集索引和非簇集索引。
9.SQL Server中的变量分为两种,全局变量和局部变量。
其中全局变量的名称以@@字符开始,由系统定义和维护;局部变量以@字符开始,由用户自己定义和赋值。
10.实现数据完整性的途径有默认值、约束、规则、存储过程、触发器等。
11.访问SQL Server数据库对象时,需要经过身份验证和权限验证两个阶段,其中身份验证分为Windows验证模式和混合验证模式。
12.SQL Server使用日志文件记载用户对数据库进行的所有操作。
13.sp_help系统存储过程的功能是显示数据对象的相关属性。
?14.SQL语言中行注释的符号为-- ;块注释的符号为/* */ 。
sqlserver主键自增的实现示例

sqlserver主键自增的实现示例在SQL Server中,可以使用自增主键来自动生成唯一的标识符。
以下是几种实现自增主键的示例。
方法一:使用IDENTITY列IDENTITY列是一种自动增长列,可以在创建表时定义为主键列。
在插入新行时,IDENTITY列会自动递增,从而为行生成唯一的主键值。
示例代码如下:```CREATE TABLE MyTableIDINTIDENTITY(1,1)PRIMARYKEY,Column1 VARCHAR(50),Column2 INTINSERT INTO MyTable (Column1, Column2)VALUES ('Value 1', 100)--输出新插入行的主键值SELECT SCOPE_IDENTIY( AS NewID```在上述示例中,创建了一个名为"MyTable"的表,其中包含一个IDENTITY列"ID"作为主键列。
在插入新行时,可以通过SCOPE_IDENTITY(函数返回刚插入行的主键值。
方法二:使用SEQUENCE对象SEQUENCE对象是一种独立于表的对象,可以用来生成唯一的自增序列。
在插入新行时,可以使用NEXTVALUEFOR语句获取下一个序列值作为主键值。
示例代码如下:```CREATE SEQUENCE MySequenceSTARTWITH1INCREMENTBY1MINVALUE1NOCYCLECREATE TABLE MyTableIDINTPRIMARYKEY,Column1 VARCHAR(50),Column2 INT--插入新行时获取下一个序列值INSERT INTO MyTable (ID, Column1, Column2)VALUES (NEXT VALUE FOR MySequence, 'Value 1', 100)--输出新插入行的主键值SELECT SCOPE_IDENTIY( AS NewID```在上述示例中,首先创建了一个名为"MySequence"的SEQUENCE对象,然后创建了一个名为"MyTable"的表,其中包含一个整型"ID"列作为主键列。
SQL_Server数据库试题六及答案范文

SQL_Server数据库试题六及答案范⽂SQL Server数据库试卷6⼀、单项选择题(每题2分,共15题)1、DBMS是什么?()(A)操作系统(B)数据库管理系统(C)数据库(D)数据库管理员2、SQL Server 2000是⼀个()的数据库系统。
(A)⽹状型(B)层次型(C)关系型(D)以上都不是3、SQL Server 2000 采⽤的⾝份验证模式有()。
(A)仅Windows⾝份验证模式(B)仅SQL Server⾝份验证模式(C)仅混合模式(D)Windows⾝份验证模式和混合模式4、关于主键描述正确的是:()(A)包含⼀列(B)包含两列(C)包含⼀列或者多列(D)以上都不正确5、下列()数据库不属于SQL Server 2000在安装时创建的系统数据库。
(A)master (B)NorthWind (C)model (D)bookdb6、在SQL SERVER中局部变量前⾯的字符为:()(A)* (B)# (C)@@ (D)@7、在SQL Server 2000中,当数据表被修改时,系统⾃动执⾏的数据库对象是()。
(A)存储过程(B)触发器(C)视图(D)其他数据库对象8、SQL Server的字符型系统数据类型主要包括()。
(A)Int、money、char (B)char、varchar、text(C)datetime、binary、int (D)char、varchar、int9、在SELECT语句的WHERE⼦句的条件表达式中,可以匹配0个到多个字符的通配符是()(A)* (B)% (C)- (D)? 10、在WHILE循环语句中,如果循环体语句条数多于⼀条,必须使⽤:(A)BEGIN……END(B)CASE……END(C)IF…………THEN(D)GOTO11、SELECT查询中,要把结果中的⾏按照某⼀列的值进⾏排序,所⽤到的⼦句是:(A)ORDER BY (B)WHERE (C)GROUP BY (D)HA VING 12、要删除视图myview,可以使⽤()语句。
导入导出时主键与约束丢失的问题解决

最近使用MSSQL数据库,将数据导入到服务器的时候,主键老是丢失,烦死我了.一直一直烦.没办法,我是菜鸟.今天上网搜索了一下,居然找到了一个好东西,立马试验一下.结果表明,已经成功!看图:下面介绍一下这个事情要怎么处理:导入数据时,使用默认选项,会丢失主键、约束、默认值等属性,按如下步骤操作:-->导出向导-->选择数据源-->选择目的-->指定表复制或查询:不要使用默认选项,选择“在SQL Server数据库之间复制对象和数据”-->选择要复制的对象:在本页中根据需要选择相应的开关项,对于列约束,必须选择“扩展属性”,若去掉“复制所有对象”,可以选择你要导出的表或对象-->其余按默认步骤即可下面是详细流程:1、打开本地企业管理器,先创建一个SQL Server注册来远程连接服务器端口SQL Server。
步骤如下图:2、弹出窗口后输入内容。
"总是提示输入登陆名和密码"可选可不选,如下图.3、注册好服务器后,点击打开。
如果是选择了"总是提示输入登陆名和密码"的话再点了确定后会提示输入用户密码,如图3。
4、进入后,选择到您的数据库,如testdb。
在上面点右键,"所有任务">>"导入数据",如图4。
5、进入DTS导入/导出向导,点击“下一步”按钮继续6、选择数据源,输入数据源所在的数据库服务器名称、用户名、密码和要复制数据的源数据库,点击“下一步”按钮7、选择“在SQL Server数据库之间复制对象和数据”方式,点“下一步”继续8、这一步可以把"包括扩展属性"和"排序规则"两个选择上。
接着去掉左下的"使用默认选项",点击右下角的"选项"来进行配置。
9、图8中点"选项"后会弹出图9,把"复制数据库用户和数据库角色"与"复制对象级权限"两个选项去掉,点确定回到图8接着点"下一步"进到图10。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
关于数据库的逻辑设计,是一个很广泛的问题。
本文主要针对开发应用中遇到在MS SQL Server上进行表设计时,对表的主键设计应注意的问题以及相应的解决办法。
主键设计现状和问题
关于数据库表的主键设计,一般而言,是根据业务需求情况,以业务逻辑为基础,形成主键。
比如,销售时要记录销售情况,一般需要两个表,一个是销售单的概要描述,记录诸如销售单号、总金额一类的情况,另外一个表记录每种商品的数量和金额。
对于第一个表(主表),通常我们以单据号为主键;对于商品销售的明细表(从表),我们就需要将主表的单据号也放入到商品的明细表中,使其关联起来形成主从关系。
同时该单据号与商品的编码一起,形成明细表的联合主键。
这只是一般情况,我们稍微将这个问题延伸一下:假如在明细中,我们每种商品又可能以不同的价格方式销售。
有部分按折扣价格销售,有部分按正常价格销售。
要记录这些情况,那么我们就需要第三个表。
而这第三个表的主键就需要第一个表的单据号以及第二个表的商品号再加上自身需要的信息一起构成联合主键;又或者其他情况,在第一个主表中,本身就是以联合方式构成联合主键,那么也需要在从表中将主表的多个字段添加进来联合在一起形成自己的主键。
数据冗余存储:随着这种主从关系的延伸,数据库中需要重复存储的数据将变得越来越庞大。
或者当主表本身就是联合主键时,就必须在从表中将所有的字段重新存储一次。
SQL复杂度增加:当存在多个字段的联合主键时,我们需要将主表的多个字段与子表的多个字段关联以获取满足某些条件的所有详细情况记录。
程序复杂度增加:可能需要传递多个参数。
效率降低:数据库系统需要判断更多的条件,SQL语句长度增加。
同时,联合主键自动生成联合索引
WEB分页困难:由于是联合主键方式(对于多数的子表),那么在WEB页面上要进行分页处理时,在自关联时,难于处理。
解决方案
从上面,我们已经看到现有结构存在着相当多的弊端,主要是导致程序复杂、效率降低并且不利于分页。
为解决上述问题,本文提出:当应用系统后台数据库表间存在主从关系时,数据库表额外增加一非业务字段作为主键,该字段为数值型;或者当该表需要在应用中进行分页查询时,也应考虑如此设计。
一般地,我们也可以几乎为任何表增加一个与业务逻辑无关的字段作为该表的主键字段。
由于该字段要作为表的主键,那么其首要条件是要保证在该表中要具有唯一性。
同时,结合SQL Server数据库自身的特性,可以为其建立一个自增列:
create TABLE T_PK_DEMO
(
U_ID BIGINT NOT NULL IDENTITY(1,1),
&nd as h;唯一标识记录的ID
COL_OTHER VARchar(20) NOT NULL ,
–其他列
CONSTRAINT PK_T_PK_DEMO PRIMARY KEY NONCLUSTERED
(U_ID)–定义为主键
)
但是,SQL Server中的自增列却存在一个比较尴尬的事实,那就是该字段一旦定义和使用,用户无法直接干预该字段的值,完全由数据库系统自身控制:
完全数据库系统控制,用户无法修改值
在数据库的发布和订阅时,使用自增列会比较麻烦
恢复部分数据时,使用自增列会比较麻烦
该列的值必须在插入数据后才能获取
鉴于此,建议不以自增列的方式来定义,而是参考Oracle数据库系统中序列,在SQL Server 系统中实现类似Oracle数据库系统序列功能。
这个具体在下面的小节中介绍。
我们只需要按照普通字段的定义方式修改表定义为:
create TABLE T_PK_DEMO
(
U_ID BIGINT NOT NULL ,–唯一标识记录的ID
COL_OTHER VARchar(20) NOT NULL ,–其他列
CONSTRAINT PK_T_PK_DEMO PRIMARY KEY NONCLUSTERED (U_ID)–定义为主
键
)
参照Oracle序列的功能,我们需要在SQL Server数据库中创建一个新表,以管理序列值:
create TABLE T_DB_SEQ
(
SEQ_NAMEVARchar(50) NOT NULL ,–序列名称
SEQ_OWNER VARchar(50) NOT NULL DEFAULT ’DBO’,
–序列所有者(SYSTEM_USER)
SEQ_CURRENT BIGINT NOT NULL DEFAULT 0,–序列当前值
SEQ_MIN BIGINT NOT NULL DEFAULT 0,–序列最小值
SEQ_MAX BIGINT NOT NULL DEFAULT 0,–序列最小值
SEQ_MAX BIGINT NOT NULL DEFAULT 0,–序列最大值
SEQ_STEPINT NOT NULL DEFAULT 1,–序列增长步长
IF_CYCLEINT NOT NULL DEFAULT 0,–是否循环(0,不循环;1,循环) CONSTRAINT T_DB_SEQ PRIMARY KEY CLUSTERED
(SEQ_NAME,SEQ_OWNER)–主键
)
应用系统为需要创建自增列的表创建一个序列名称,在表“T_DB_SEQ”中反映为数据库中的一行。
第一,需要为需要建立序列的表创建一个序列。
采用方法:F_create_SEQ(序列名)。
该函数传入序列的名称,在表“T_DB_SEQ”插入一行。
序列的所有者,采用系统变量
SYSTEM_USER。
第二,获取下一个值。
采用方法:F_GET_NEXT_SEQ_VAL(序列名)。
该函数根据序列名获取该序列的下一个值,根据当前值与增长步长得到。
同时,该函数保证在同时获取同一个序列时,应保证并发一致性。
第三、将返回值返回到应用使用。
此外,为保证应用的完整性,可能还需要提供一些方法的重载方法,同时提供一些其他方法:
获取序列当前值:F_GET_SEQ_CUR_VAL(序列名)
设置序列值:F_SET_SEQ_VAL(序列名)
删除序列:F_DEL_SEQ(序列名)
判断序列是否存在:F_SEQ_exists(序列名)
在主从关系的表设计中,子表也使用序列字段作为唯一主键,将父表的序列字段作为外键关联:
create TABLE T_PK_DEMO_C
(
U_ID BIGINT NOT NULL ,–唯一标识记录的ID
COL_OTHER VARchar(20) NOT NULL ,–其他列
P_ID INT NOT NULL ,–父表ID
CONSTRAINT PK_T_PK_DEMO_C PRIMARY KEY
NONCLUSTERED (U_ID)–定义为主键
CONSTRAINT FK_T_PK_DEMO_C FOREIGN KEY (P_ID)
REFERENCES T_PK_DEMO(U_ID) ON delete CASCADE,
)
使用序列的问题及解决办法
由于系统使用一个额外增加一个字段作为主键,因此没有为业务逻辑建立主键约束。
比如在企业用户信息表中,要求企业中用户登录名必须唯一。
一般在创建表时,以登录名作为主键,这个时候在数据库层自然的创建另一个主键唯一性约束。
而现在没有使用登录名作为主键,那么就没有这个约束。
解决办法:
一是在数据库层解决。
可以为该表创建一个唯一(UNIQUE)约束或者唯一索引。
如:
alter TABLE T_PK_DEMO ADD CONSTRAINT C_T_PK_DEMO UNIQUE NONCLUSTERED(COL_OTHER)-唯一约束
create UNIQUE INDEX IX_T_PK_DEMO ON T_PK_DEMO(COL_OTHER)–唯一索引
二是在应用端解决。
也就是在应用中判断该列是否有重复值,然后根据判断结果来保证唯一性。
我们注意到,在之前的例子中,主键采用了NONCLUSTERED(非聚蔟)的索引方式。
关于如何设计索引,不是本文的重点,在这里仅提供一个建立索引时采用聚蔟方式还是非聚蔟方式的一个一般原则:
作为非业务字段的主键列,是一个没有重复值的、基本不进行更新操作的列。
并且,在SQL Server数据库中,聚蔟索引在一个表中只能有一个。
因此,聚蔟索引非常重要,需要留给更重要的字段来使用。
因此,对照上表和根据聚蔟索引的重要程度,在此处采用非聚蔟方式创建其索引。
具体应用
采用这种主键设计方式,有诸多好处,这已经在前文说明。
现在就以一个具体的应用来说明如何使用这个主键。
当前的应用系统基本上都已经采用B/S方式,尽管现在的网络速度已经有大幅度的提高,但是由于在WEB应用上用户数量众多、同时基本上所有的运算都集中在WEB应用服务器上,所以在WEB设计上更要考虑到性能的优化,以减少网络流量和对服务器的压力。
最常见的一个应用就是列表方式展现时的分页方式。
一般的,在数据量小的情况下,一般不会怎么注意这个问题,通常采用将数据完全取出,然后在WEB服务器上进行分页。
但是,当数据量庞大时,这种方式就会导致速度降低,甚至根本不可用。
所以,一般采用存储过程,在数据库端进行分页。