关于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。
SQL 主键自增
SQL 主键自增
环境:SQL Server 2008
问题:设置主键和把它设为自增。
解决:点击table->选中表->design->选中需要设置主键的字段,单击右键"设置主键"即可。
若要设置主键自增,在列属性中找到标识规范,单击左边的"+"号,把否改为是,其他默认即可。
create table tableName(
id int identity(1,1) primary key,
data varchar(50)
)
/*
identity(1,1)就是自动增加,第一个参数是种子值,第二个是增量值;
primary key是主键
*/
Insert into tableName values('aaaaa');就会自动在数据表中自增添加主键值。
注意:如果主键没有设置为自增那么这条语句将无法执行,会提示:
服务器: 消息 213,级别 16,状态 4,行 1
插入错误: 列名或所提供值的数目与表定义不匹配。
sql server常见面试题
sql server常见面试题以下是一些常见的SQL Server 面试题及其答案:1. 什么是SQL Server?SQL Server 是由Microsoft 开发的关系型数据库管理系统(RDBMS)。
它是一个功能强大、可靠性高的数据库平台,广泛用于企业级应用和数据管理。
2. 什么是数据库?数据库是一个组织结构化的数据集合,可以通过数据库管理系统(DBMS)进行访问、管理和操作。
它提供了一种存储、检索和处理数据的方式。
3. 什么是表?表是数据库中的基本组成单元,用于存储数据。
它由列(字段)和行组成,每个列定义了数据类型和约束规则,每一行表示一个记录。
4. 什么是主键?主键是表中唯一标识每个记录的列或列组合。
它用于确保数据的唯一性和完整性,并且在建立关系时起到重要作用。
5. 什么是外键?外键是表中与其他表的关联字段,它建立了表之间的关系。
外键约束用于确保引用表中的数据完整性,并支持表之间的数据关联。
6. 什么是索引?索引是一种数据结构,用于快速定位和访问数据库中的数据。
它可以加快查询的速度,但会增加写操作的开销。
常见的索引类型包括聚集索引、非聚集索引和全文索引。
7. 什么是事务?事务是数据库操作的基本单位,它是由一个或多个数据库操作组成的逻辑工作单元。
事务要么完全执行,要么完全回滚,以确保数据的一致性和完整性。
8. 什么是视图?视图是从一个或多个表中派生的虚拟表。
它是一个预定义的查询,可以像操作表一样使用。
视图提供了数据的安全性、简化了复杂的查询和隐藏了底层数据结构的能力。
9. 什么是存储过程?存储过程是一组预编译的SQL 语句,以及可选的流程控制语句,用于执行特定任务。
它们被保存在数据库中,并可以通过名称调用和执行,提供了代码重用和性能优化的好处。
10. 什么是触发器?触发器是与表相关联的特殊类型的存储过程。
它们在插入、更新或删除表中的数据时自动触发,并允许执行其他的业务逻辑或数据操作。
这些问题涵盖了SQL Server 中的一些基本概念和功能。
SqlServer数据库面试题(一)
SQL面试题目SQL分类:DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE)DML—数据操纵语言(SELECT,DELETE,UPDATE,INSERT)DCL—数据控制语言(GRANT,REVOKE,COMMIT,ROLLBACK) 首先,简要介绍基础语句:1、说明:创建数据库CREATE DATABASE database-name2、说明:删除数据库drop database dbname3、说明:备份sql server--- 创建备份数据的deviceUSE masterEXEC sp_addumpdevice 'disk', 'testBack', 'c:mssql7backupMyNwind_1.dat'--- 开始备份BACKUP DATABASE pubs TO testBack4、说明:创建新表create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)根据已有的表创建新表:A:create table tab_new like tab_old (使用旧表创建新表)B:create table tab_new as select col1,col2…from tab_old definition only5、说明:删除新表drop table tabname6、说明:增加一个列Alter table tabname add column col type注:列增加后将不能删除。
DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。
7、说明:添加主键:Alter table tabname add primary key(col) 说明:删除主键:Alter table tabname drop primary key(col)8、说明:创建索引:create [unique] index idxname on tabname(col….) 删除索引:drop index idxname注:索引是不可更改的,想更改必须删除重新建。
SQL Server设置主键自增
3.已经建好一数据表,里面有字段id,将id设为主键
alter table tb alter column id int not null
alter table tb add constraint pkid primary key (id)
SQL Server设置主键自增长列(使用sql语句实现)
主键自增长列在进行数据插入的时候,很有用的,如可以获取返回的自增ID值,接下来将介绍SQL Server如何设置主键自增长列,感兴趣的朋友可以了解下,希 代码如下
4.删除主键
Declare @Pk varChar(100);
Select @Pk=Name from sysobjects where Parent_Obj=OBJECT_ID('tb') and xtype='PK';
if @Pk is not null
exec('Alter table tb Drop '+ @Pk)
create table tb(id int,constraint pkid primary key (id))
create table tb(id int primary key )
2.新建一数据表,里面有字段id,将id设为主键且自动编号
create table tb(id int identity(1,1),constraint pkid primary key (id))
查询主键的sql语句
查询主键的sql语句查询主键的SQL语句可以根据不同的数据库系统而有所不同。
以下是针对常见数据库系统的查询主键的SQL语句:1. 对于MySQL数据库,可以使用以下SQL语句查询主键:sql.SHOW KEYS FROM table_name WHERE Key_name = 'PRIMARY';其中,`table_name`是要查询的表的名称。
2. 对于Oracle数据库,可以使用以下SQL语句查询主键:sql.SELECT constraint_name, column_name.FROM user_cons_columns.WHERE table_name = 'YOUR_TABLE_NAME';其中,`YOUR_TABLE_NAME`是要查询的表的名称。
3. 对于SQL Server数据库,可以使用以下SQL语句查询主键:sql.SELECT COLUMN_NAME.FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE.WHERE OBJECTPROPERTY(OBJECT_ID(CONSTRAINT_SCHEMA + '.' + CONSTRAINT_NAME), 'IsPrimaryKey') = 1。
AND TABLE_NAME = 'YOUR_TABLE_NAME';其中,`YOUR_TABLE_NAME`是要查询的表的名称。
4. 对于PostgreSQL数据库,可以使用以下SQL语句查询主键:sql.SELECT pg_attribute.attname.FROM pg_index, pg_class, pg_attribute.WHERE pg_class.oid = 'YOUR_TABLE_NAME'::regclass. AND indrelid = pg_class.oid.AND pg_attribute.attrelid = pg_class.oid.AND pg_attribute.attnum = any(pg_index.indkey);其中,`YOUR_TABLE_NAME`是要查询的表的名称。
SQLServer主键自动生成_表and存储过程
SQLServer主键⾃动⽣成_表and存储过程主键表:CREATE TABLE [dbo].[KEYCODE]([KeyName] [varchar](12) NOT NULL,[KeyTableName] [varchar](40) NULL,[KeyFieldName] [varchar](30) NULL,[StrLen] [int] NULL,[CodeLen] [int] NULL,[CodeMin] [float] NULL,[CodeMax] [float] NULL,[CodeType] [varchar](1) NULL,[CurrentCode] [float] NULL,[FirstLoop] [varchar](1) NULL,[Prefix] [varchar](6) NULL,[Suffix] [varchar](6) NULL,[Remarks] [varchar](500) NULL,CONSTRAINT [PK_KEYCODE] PRIMARY KEY CLUSTERED([KeyName] ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY] ) ON [PRIMARY]主键⽣成SQL:Create Procedure [dbo].[SP_GetKeyCode]@KeyName Varchar(20),@KeyCode Varchar(30) Output,@IsReturn Bit = 0ASDeclare @zeroStr as Varchar(30),@MaxRunningCode as Varchar(30),@KeyTableName as Varchar(40),@KeyFieldName as Varchar(40),@CodeLen as Smallint,@CodeMin as Decimal(20,0),@CodeMax as Decimal(20,0),@CodeType as Varchar(1),@CurrentCode as Decimal(20,0),@FirstLoop as varchar(1),@Prefix as Varchar(6),@Suffix as Varchar(6),@preFixStr as Varchar(10),@tmpstr as Varchar(30),@tempStr1 as Varchar(40),@sSQL as Varchar(400),@CCode as Decimal(20,0), @RetStr as Varchar(20),@CurrentKeyCode as Varchar(30),@I as smallint, @HeadStr as Varchar(20)DECLARE @TableNameStartPos SmallIntset @zeroStr = '000000000000000000000000000000'Set @MaxRunningCode= '999999999999999999999999999999'set @KeyName = Upper(@KeyName)--set @HeadStr = upper(@HeadStr)if not exists(Select * from KeyCode where KeyName = @KeyName)BeginIf @IsReturn = 1BeginSelect @KeyName keyname, '' KeyCodeSet @KeyCode = ''ReturnEndRaisError('%s is an invalid KeyName!',16,1,@KeyName)Select @KeyCode = ''ReturnendSelect @KeyTableName = IsNull(KeyTableName,''),@KeyFieldName = IsNull(KeyFieldName,''),@CodeLen = IsNull(CodeLen,0),@CodeMin = Cast(IsNull(CodeMin,0) as Decimal(20,0)),@CodeMax = cast(IsNull(CodeMax,99) as Decimal(20,0)),@CodeType = IsNull(CodeType,'1'),@CurrentCode = Cast(IsNull(CurrentCode,0) as Decimal(20,0)),@FirstLoop = IsNull(FirstLoop,'0'),@Prefix = IsNull(Prefix,''),@Suffix = IsNull(Suffix,'')From KeyCode Where KeyName = @KeyName-- To exclude alias from KeyTableName (:DELIBASE:DELORD --> DELORD)set @tableNameStartPos=Patindex('%BASE:%',@KeyTableName)if @tableNameStartPos>0set @KeyTableName=subString(@KeyTableName,@TableNameStartPos+5,len(@KeyTableName)-@TableNameStartPos-4)Set @HeadStr = @PrefixSet @preFixStr=''if @CodeType = '1'Beginif @FirstLoop = '1'set @tmpstr = Cast((@CurrentCode + 1) as Varchar(20))elsebeginset @tmpstr = Cast((@CurrentCode+1) as Varchar(20))set @CCode = @CurrentCode + 1Update KeyCode set CurrentCode =Cast(@CCode as Decimal(20,0)) where keyname = @KeyNameset @TempStr1= @HeadStr + SubString(@zerostr,1,@CodeLen - len(@tmpstr))+ @tmpstrif @CCode > @CodeMax ---Find from beginningbeginIf @IsReturn = 1BeginSelect 'Error' KeyName, 'All numbers are occupied!' KeyCodeSet @KeyCode = ''ReturnraisError('All numbers are occupied!',16,1)Select @KeyCode = ''returnendend --- FirstLoop <>'1'set @retstr = @TmpStrend --- CodeType ='1'if @CodeType = '2' --- YY + XXXXXXBeginset @prefixStr = SUbString(Cast(year(GetDate()) as Varchar(4)),3,2)if @KeyTableName <> @prefixStrbeginset @CurrentCode = @COdeMin -1Update KeyCode set KeyTableName = @prefixStr,CurrentCode = @CurrentCodewhere KeyName = @KeyNameendset @retStr=Cast((@CurrentCode+1) as Varchar(10))endif @CodeType = '3' --YY + MM + XXXXXXbeginSet @PrefixStr = Cast(Month(GetDate()) as Varchar(2))if len(@PrefixStr)=1Set @PrefixStr = '0' + @PrefixStrset @prefixStr = SUbString(Cast(year(GetDate()) as Varchar(4)),3,2) + @PrefixStrif @KeyTableName <> @prefixStrbeginset @CurrentCode=@CodeMin - 1Update KeyCode set KeyTableName = @prefixStr,CurrentCode = @CurrentCOdewhere KeyName = @KeyNameendset @retStr=Cast((@CurrentCode+1) as Varchar(10))endif @CodeType = '4' -- YY+MM+DD+xxxxxBeginSet @TmpStr = Cast(Month(GetDate()) as Varchar(2))if len(@tmpStr)=1Set @tmpStr = '0' + @tmpStrSet @tempStr1 = Cast(day(GetDate()) as Varchar(2))if len(@tempStr1)=1Set @tempStr1 = '0' + @tempStr1set @prefixStr = SUbString(Cast(year(GetDate()) as Varchar(4)),3,2) + @tmpStr+@tempStr1 if @KeyTableName <> @prefixStrbeginset @CurrentCode = @CodeMin -1Update KeyCode set KeyTableName = @prefixStr,CurrentCode = @CurrentCodewhere KeyName = @KeyNameendset @retStr=Cast((@CurrentCode+1) as Varchar(10))endif @CodeType = '5' -- YYYY+MM+xxxxxbeginSet @PrefixStr = Cast(Month(GetDate()) as Varchar(2))if len(@PrefixStr)=1Set @PrefixStr = '0' + @PrefixStrset @prefixStr = Cast(year(GetDate()) as Varchar(4)) + @PrefixStrif @KeyTableName <> @prefixStrbeginset @CurrentCode=@CodeMin - 1Update KeyCode set KeyTableName = @prefixStr,CurrentCode = @CurrentCOdewhere KeyName = @KeyNameendset @retStr=Cast((@CurrentCode+1) as Varchar(10))endIf @CodeType = '7' -- DDxxxx Moorthy 19/10/00BeginSet @tmpStr = Cast(Day(GetDate()) As Varchar(2))set @PrefixStr = @PRefixStr + replicate('0',2-len(@TmpStr)) + @TmpStrif @KeyTableName <> @Prefixstrbeginset @CCode = @CodeMin - 1Update KeyCode set KeyTableName = @prefixStr,CurrentCode = @CodeMin - 1where KeyName = @KeyNameendset @retStr = Cast((@CurrentCode+1) as Varchar(10))Endif @CodeType = '8' -- xYMxxxx ---- running number reset monthlyBeginSet @tmpStr = Cast(Right(Year(GetDate()),1) As Varchar(2))If Cast(Month(GetDate()) As Varchar(2)) = '10'Set @TmpStr = @TmpStr + 'A'Else If Cast(Month(GetDate()) As Varchar(2)) = '11'Set @TmpStr = @TmpStr + 'B'Else If Cast(Month(GetDate()) As Varchar(2)) = '12'Set @TmpStr = @TmpStr + 'C'ElseSet @TmpStr = @TmpStr + Cast(Month(GetDate()) As Varchar(2))set @PrefixStr = @PRefixStr + replicate('0',2-len(@TmpStr)) + @TmpStrif @KeyTableName <> @Prefixstrbeginset @CCode = @CodeMin - 1Update KeyCode set KeyTableName = @prefixStr,CurrentCode = @CodeMin - 1where KeyName = @KeyNameendset @retStr = Cast((@CCode+1) as Varchar(10))if cast(@retstr as Decimal(20,0)) = @CodeMax -- modify CurrentCodeUpdate KeyCode set CurrentCode = @CodeMin -1 where KeyName = @KeyNameelseUpdate KeyCode set CurrentCode =Cast(@retstr as Decimal(20,0)) where keyname = @KeyNameSet @retstr = @HeadStr+ @PrefixStr + SubString(@zeroStr,1,@CodeLen-len(@retstr))+ @retstr+ @Suffix Select @KeyCode = @RetStrIf @IsReturn = 1BeginSelect @KeyName KeyName, @KeyCode KeyCodeSet @KeyCode = ''ReturnEnd。
SQLServer外键关系是强制约束,外键值也可以是空(NULL)
SQLServer外键关系是强制约束,外键值也可以是空(NULL)在SQL Server中,实际上外键值可不可以为空(NULL),和外键关系是不是强制约束⽆关。
我们先在SQL Server数据库中建⽴两张表People和Car,⼀个People可以有多个Car,所以这两张表是⼀对多关系。
建⽴表People建表语句:CREATE TABLE[dbo].[People]([ID][int]NOT NULL,[Name][nvarchar](50) NULL,[Age][int]NULL,[Sex][nvarchar](50) NULL,CONSTRAINT[PK_People]PRIMARY KEY CLUSTERED([ID]ASC)WITH (PAD_INDEX =OFF, STATISTICS_NORECOMPUTE =OFF, IGNORE_DUP_KEY =OFF, ALLOW_ROW_LOCKS =ON, ALLOW_PAGE_LOCKS =ON) ON[PRIMARY] ) ON[PRIMARY]GO其中列ID是People表的主键Car建表语句:CREATE TABLE[dbo].[Car]([ID][int]NOT NULL,[Brand][nvarchar](50) NULL,[PeopleID][int]NULL,CONSTRAINT[PK_Car]PRIMARY KEY CLUSTERED([ID]ASC)WITH (PAD_INDEX =OFF, STATISTICS_NORECOMPUTE =OFF, IGNORE_DUP_KEY =OFF, ALLOW_ROW_LOCKS =ON, ALLOW_PAGE_LOCKS =ON) ON[PRIMARY] ) ON[PRIMARY]GOALTER TABLE[dbo].[Car]WITH CHECK ADD CONSTRAINT[FK_Car_People]FOREIGN KEY([PeopleID])REFERENCES[dbo].[People] ([ID])GOALTER TABLE[dbo].[Car]CHECK CONSTRAINT[FK_Car_People]GO其中列ID是Car表的主键,此外列PeopleID是Car表的外键,其关联People表的主键ID。
SQL的主键和外键的作用
SQL的主键和外键约束SQL的主键和外键的作用:外键取值规则:空值或参照的主键值。
(1)插入非空值时,如果主键表中没有这个值,则不能插入。
(2)更新时,不能改为主键表中没有的值。
(3)删除主键表记录时,你可以在建外键时选定外键记录一起级联删除还是拒绝删除。
(4)更新主键记录时,同样有级联更新和拒绝执行的选择。
简而言之,SQL的主键和外键就是起约束作用。
关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键。
比如:学生表(学号,姓名,性别,班级)其中每个学生的学号是唯一的,学号就是一个主键;课程表(课程编号,课程名,学分)其中课程编号是唯一的,课程编号就是一个主键;成绩表(学号,课程号,成绩)成绩表中单一一个属性无法唯一标识一条记录,学号和课程号的组合才可以唯一标识一条记录,所以,学号和课程号的属性组是一个主键。
成绩表中的学号不是成绩表的主键,但它和学生表中的学号相对应,并且学生表中的学号是学生表的主键,则称成绩表中的学号是学生表的外键;同理,成绩表中的课程号是课程表的外键。
定义主键和外键主要是为了维护关系数据库的完整性,总结一下:一、主键是能确定一条记录的唯一标识,比如,一条记录包括身份正号,姓名,年龄。
身份证号是唯一能确定你这个人的,其他都可能有重复,所以,身份证号是主键。
外键用于与另一张表的关联。
是能确定另一张表记录的字段,用于保持数据的一致性。
比如,A 表中的一个字段,是B表的主键,那他就可以是A表的外键。
二、主键、外键和索引的区别定义:主键--唯一标识一条记录,不能有重复的,不允许为空外键--表的外键是另一表的主键, 外键可以有重复的, 可以是空值索引--该字段没有重复值,但可以有一个空值作用:主键--用来保证数据完整性外键--用来和其他表建立联系用的索引--是提高查询排序的速度个数:主键--主键只能有一个外键--一个表可以有多个外键索引--一个表可以有多个唯一索引创建SQL的主键和外键约束的方法:create table Student --建表格式:create table 自定义的表名(--字段名一般为有一定意义的英文StudentName nvarchar(15),-- 格式:字段名类型()括号里面的是允许输入的长度StudentAge int,--int型的后面不需要接长度StudentSex nvarchar(2)--最后一个字段后面不要逗号)--在创建表时就可以对字段加上约束:create table Student(StudentNo int PRIMARY KEY IDENTITY(1,1),--加主键约束,还有标识列属性(两者构成实体完整性)StudentName nvarchar(15)not null,--加非空约束,不加"not null" 默认为:可以为空StudentSchool text(20)FOREIGN KEY REFERENCES SchoolTable(SchoolName) ,--加外键约束,格式:FOREIGN KEY REFERENCES 关联的表名(字段名)StudentAge int DEFAULT((0)),--加默认值约束StudentSex nvarchar(2)CHECK(StudentSex=N'男'or StudentSex=N'女')--加检查约束,格式:check (条件表达式))--如果在表创建好了以后再加约束,则格式分别为:-- 主键:alter table表名add constraint PK_字段名--"PK"为主键的缩写,字段名为要在其上创建主键的字段名,'PK_字段名'就为约束名primary key(字段名)--字段名同上--唯一约束:alter table表名add constraint UQ_字段名unique(字段名)--外键约束:alter table表名add constraint FK_字段名--"FK"为外键的缩写foreign key(字段名)references关联的表名(关联的字段名)--注意'关联的表名'和'关联的字段名'alter table表A add constraint FK_B foreign key(ticket_no)references表B(ticket_no)alter table表A add constraint FK_C foreign key(person_no)references表C(person_no)alter table成绩表add constraintFK_StudentNo foreign key (StudentNo)references Student (StudentNo) ON UPDATE CASCADE ON DELETE CASCADE级联更新,级联删除,这样在删除主表Student时,成绩表中该学生的所有成绩都会删除。
SQL--主键
SQL--主键
主键
数据库主键是指表中⼀个列或列的组合,其值能唯⼀地标识表中的每⼀⾏。
这样的⼀列或多列称为表的主键,通过它可强制表的实体完整性。
当创建或更改表时可通过定义 PRIMARY KEY约束来创建主键。
⼀个表只能有⼀个 PRIMARY KEY 约束,⽽且 PRIMARY KEY 约束中的列不能接受空值。
由于 PRIMARY KEY 约束确保唯⼀数据,所以经常⽤来定义标识列。
主键的主要作⽤如下:
(1)保证实体的完整性;
(2)加快数据库的操作速度;
(3)在表中添加新记录时,数据库会⾃动检查新记录的主键值,不允许该值与其他记录的主键值重复;
(4) 数据库⾃动按主键值的顺序显⽰表中的记录。
如果没有定义主键,则按输⼊记录的顺序显⽰表中的记录。
主键具有的特点:唯⼀性、⾮空性。
设置主键语句⽰例:
code int primary key, 主键不能为空,不能重复,确保唯⼀性
设置⾃增长主键语句⽰例:
code int primary key identity(1,1) 从1开始,每次增长1,添加values时不⽤添加此列
设置外键:
在要设置外键的表上右键,选择设计,在需要设置外键的列名前右键,如下图:
选择关系单击,出现对话框,单击添加,单击表和列规范后⾯的省略号,如下图:
在出现的界⾯做出如下操作:
点击确定,再点击确定,操作成功。
SQLServer添加与删除主键约束
SQLServer添加与删除主键约束PRIMARY KEY 约束唯⼀标识数据库表中的每条记录。
主键必须包含唯⼀的值。
主键列不能包含 NULL 值。
每个表都应该有⼀个主键,并且每个表只能有⼀个主键。
主键约束操作包含了添加约束和删除约束,修改约束其实是添加约束或者删除约束。
添加主键约束⽐较简单,但是删除⼀个没有约束名的主键约束则⽐较复杂,如果不是很不了解SQL Server的话则⽐很难实现该功能。
主键约束操作基本语句如果是在新建表的时候添加主键约束⽐较简单,直接在列名后加⼊primary key即可,标准的添加主键约束的SQL脚本如下:create table 表名 ( 字段名1 int not null, ...,[constraint 约束名] primary key (字段名1, …))其中约束名可选(建议选择,否则系统会分配随机临时名称)。
这种⽅法可以任意添加多个或⼀个主键约束。
对已有表添加主键约束,与上⾯的脚本类似,如下:alter table 表名 [add constraint 约束名] primary key(字段名1,... )其中约束名与上相同,可选,建议指定。
SQL Server删除主键约束与MySQL不同,需要主键的约束名称才能删除,SQL Server标准的删除主键的脚本如下:ALTER TABLE 表名DROP CONSTRAINT 约束名当然该语句只能删除已知约束名的主键约束。
删除未知主键约束名的约束根据之前的语句判断,这个约束名如果之前已经指定了那还好,否则此次就没有办法删除了,重点在于如何获取表中的主键约束名,既然可以根据约束名,那么就说明约束名是存储在数据库中的,当然是存储在系统表中的,运⾏下SELECT * FROM SYS.OBJECTS语句看看查询结果,数据库中所有的约束都在⾥⾯了,name项以PK⼤头的都是主键约束,看看它的type_desc是不是PRIMARY_KEY_CONSTRAINT或者type是不是 PK?(当然指定的名称没使⽤PK前缀另当别论)。
sqlserver相关的面试题
sqlserver相关的面试题含解答共20道1. 什么是SQL Server?- SQL Server 是由Microsoft 公司开发的关系型数据库管理系统(RDBMS)。
2. 什么是主键(Primary Key)?-主键是一列或一组列,其值用于唯一标识表中的每一行。
主键的值不能为NULL。
3. 什么是外键(Foreign Key)?-外键是一列或一组列,用于建立两个表之间的关联。
外键在一个表中创建,指向另一个表的主键。
4. 什么是索引(Index)?-索引是一种数据结构,用于提高数据库表的检索速度。
它类似于书籍的目录,加速数据的查找。
5. 什么是触发器(Trigger)?-触发器是一种特殊的存储过程,与表相关联,当表上的特定事件发生时,触发器会自动执行。
6. 什么是存储过程(Stored Procedure)?-存储过程是一组预编译的SQL 语句,可以在数据库中保存并由应用程序调用。
7. 区分UNION 和UNION ALL 的区别。
- UNION 会去除结果集中的重复行,而UNION ALL 保留所有行,包括重复的。
8. 什么是SQL 注入(SQL Injection)?- SQL 注入是一种攻击技术,通过向应用程序的输入中注入SQL 代码,从而破坏数据库查询。
9. 什么是事务(Transaction)?-事务是一组SQL 语句,它们作为一个单一的工作单元执行,要么全部执行,要么全部回滚。
10. 解释ACID 属性。
-ACID 是数据库事务的四个特性,包括原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。
11. 什么是视图(View)?-视图是基于一个或多个表的查询结果的虚拟表。
它与物理表不同,不包含实际存储的数据。
12. 如何备份和还原数据库?-使用SQL Server Management Studio(SSMS)可以通过图形界面进行备份和还原数据库的操作,也可以使用T-SQL 命令`BACKUP` 和`RESTORE`。
- 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服务器上进行分页。
但是,当数据量庞大时,这种方式就会导致速度降低,甚至根本不可用。
所以,一般采用存储过程,在数据库端进行分页。