1.主键
什么是主键:
看一下官方文档的解释
表通常具有包含唯一标识表中每一行的值的一列或一组列。 这样的一列或多列称为表的主键 (PK),用于强制表的实体完整性。 由于主键约束可保证数据的唯一性,因此经常对标识列定义这种约束。
如果为表指定了主键约束, 数据库引擎 将通过为主键列自动创建唯一索引来强制数据的唯一性。 当在查询中使用主键时,此索引还允许对数据进行快速访问。 如果对多列定义了主键约束,则一列中的值可能会重复,但来自主键约束定义中所有列的值的任何组合必须唯一。
如下图所示, Purchasing.ProductVendor 表中的 ProductID 和 VendorID 列构成了针对此表的复合主键约束。 这确保了 ProductVendor 表中的每个行都具有 ProductID 和 VendorID 的一个唯一组合************。 这样可以防止插入重复的行。
一个表只能包含一个主键约束。
主键不能超过 16 列且总密钥长度不能超过 900 个字节。
由主键约束生成的索引不会使表中的索引数超过 999 个非聚集索引和 1 个聚集索引。
如果没有为主键约束指定聚集或非聚集索引,并且表中没有聚集索引,则使用聚集索引。
在主键约束中定义的所有列都必须定义为不为 Null。 如果没有指定为 Null 性,则参与主键约束的所有列的为 Null 性都将设置为不为 Null。
如果在 CLR 用户定义类型的列中定义主键,则该类型的实现必须支持二进制排序。
大概意思就是设置为主键的一列每个数据都是唯一的,当需要表示唯一地址或ID时会用到
摘抄一段CSDN 用户harbor1981的一段解释:
关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键
比如
学生表(学号,姓名,性别,班级)
其中每个学生的学号是唯一的,学号就是一个主键
课程表(课程编号,课程名,学分)
其中课程编号是唯一的,课程编号就是一个主键
成绩表(学号,课程号,成绩)
成绩表中单一一个属性无法唯一标识一条记录,学号和课程号的组合才可以唯一标识一条记录,所以 学号和课程号的属性组是一个主键 成绩表中的学号不是成绩表的主键,但它和学生表中的学号相对应,并且学生表中的学号是学生表的主键,则称成绩表中的学号是学生表的外键
同理 成绩表中的课程号是课程表的外键
外键(FK)是用于建立和加强两个表数据之间的链接的一列或多列。通过将保存表中主键值的一列或多列添加到另一个表中,可创建两个表之间的链接。这个列就成为第二个表的外键
2.标识列:
标识规范:
当一个列在标识规范下的(是标识)属性设为“是”,那这一列就成了标识列
先看一下官方文档对标识规范下的选项的定义:
标识指示列是否为表的标识列。 可能的值包括 True 和 False。
标识种子指示标识列的初始行值。
标识增量“标识增量”属性指定在 Microsoft SQL Server 为插入的行生成标识值时,在现有的最大行标识值基础上所加的值****。
标识列和主键作用相似,当表的数据插入时会自动生成一条对应的标识列内的数据,也就是这波数据的一个ID号,可以用这个标识列的数据来表示这波数据,举个例子:班里来了位新同学,他的信息都在档案里,那么他的年龄,性别,身高,户籍等信息录入档案后给他分配个学号,这个学号就是在标识列内的数据,年龄性别等数据就是表里的其他列存储的数据,每个同学的信息在这个表内都有唯一的一个学号(标识列内的一个号码)对应,一个表只能有一个标识列,就像身份证号码,只有这具有唯一性的一串数字表示你是你
标识增量和标识种子比较好解释,标识列的数据具有自增性,种子就是你ID号起始的地方,增量是下一个ID号加多少,例如上图我设置的标识增量55,种子10001,那么往这个表插入一组数据后他的标识号(ID)为10056,再插一组就是10111,依次类推
3.标识规范的是标识选项无法修改的解决办法:
当(是标识)变灰无法将“否”改为“是”时,请检查当前列的数据类型是否为int,“默认值或绑定”选项后是否有设置默认值
当这一列做标识时需:数据类型为int,默认值为空才可以
4.执行查询时报错:
在SQL Server Management Studio中新建查询
select SCOPE_IDENTITY() from tb_User
执行时报错
错误提示:提示对象名 'tb_User' 无效
改为前面加上数据库名,格式为:数据库名.dbo.tb_User
例 select SCOPE_IDENTITY() from db_ZDHYXXZ.dbo.tb_User
问题解决