MS SQL 2008 设置主键 该列值为啥还能重复

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MS SQL 2008 设置主键 该列值为啥还能重复相关的知识,希望对你有一定的参考价值。

RT:我设置了[User]为主键,为什么还能插入重复的用户名呢?
谢谢回答的各位了,明白了。我单用User主键就可以了,id标识自增,不一定要设置成主键。

你这个表里的主键已经是id了,所以你的user设置的主键失效了!
一个表里只能有一个主键,你如果不想让user字段重复的话,你可以在你的编程代码里面进行判断限制下就可以了!追问

谢谢!

参考技术A 设置为主键的列是不可能重复的,从你的下表看到你设置的是两个列的复合主键,因此只要两个列的值不同时重复就不是重复值。追问

谢谢!

参考技术B 你相当于设置了一个组合主键,在SQL SERVER中 只要组合主键不重复就可以不像oracle本回答被提问者采纳 参考技术C 你设定的是组合主键.
即id列和user列合起来作为主键.
当且仅当id,user都存在相同时,才会被禁止插入追问

谢谢!

MS SQL SERVER搜索某个表的主键所在的列名

原文:MS SQL SERVER搜索某个表的主键所在的列名

  SELECT SYSCOLUMNS.name
  FROM SYSCOLUMNS,SYSOBJECTS,SYSINDEXES,SYSINDEXKEYS 
  WHERE SYSCOLUMNS.id = object_id(‘Tab_XXX‘) --syscolumns.id为该列所属的表对象ID
  AND SYSOBJECTS.xtype = ‘PK‘ --sysobjects.xtype对象类型
  AND SYSOBJECTS.parent_obj = SYSCOLUMNS.id
  AND SYSINDEXES.id = SYSCOLUMNS.id
  AND SYSOBJECTS.name = SYSINDEXES.name
  AND SYSINDEXKEYS.id = SYSCOLUMNS.id
  AND SYSINDEXKEYS.indid = SYSINDEXES.indid   --同一表的同一列,可能建有不同类型的索引 
  AND SYSCOLUMNS.colid = SYSINDEXKEYS.colid

  注意:这是在4张系统表中寻找的,关系比较复杂,大致可以表示为:
  SYSCOLUMNS中存有表中的列colid和表id,sysobjects表中存有主键名字(即PK_Table类似)和表id,sysindexes中存 有主键名字和表id和index编号,sysindexkeys中存有表id和index编号和列编号,一项一项对应起来后就能找到列名了。

SELECT * FROM SYSCOLUMNS
--SYSCOLUMNS每个表和视图中的每列在表中占一行,存储过程中的每个参数在表中也占一行。
--syscolumns.id为该列所属的表对象ID
--syscolumns.colid为该列对象ID

SELECT * FROM SYSOBJECTS
--SYSOBJECTS在数据库内创建的每个对象(约束、默认值、日志、规则、存储过程、表、视图、等)在表中占一行。
--sysobjects.xtype对象类型
--sysobjects.parent_obj父对象的对象标识号(例如,对于触发器或约束,该标识号为表id)
--sysobjects.name对象名称,这里为主键名字(即PK_Table类似)


SELECT * FROM SYSINDEXES
--数据库中的每个索引和表在表中各占一行。
--sysindexes.id 表ID(如果 indid = 0 或 255)。否则为索引所属表id。
--sysindexes.name 表名(如果 indid = 0 或 255)。否则为索引的名称。这里为有主键名字(主键必为索引,见下述分析)
--sysindexes.indid 索引ID的类型

SELECT * FROM SYSINDEXKEYS
--数据库中的每个索引和表在表中各占一行。
--sysindexkeys.id      表ID
--sysindexkeys.indid  索引ID的类型
--sysindexkeys.colid   列ID

    主键一定是唯一性索引,唯一性索引并不一定就是主键

    所谓主键就是能够唯一标识表中某一行的属性或属性组,一个表只能有一个主键,但可以有多个候选索引。因为主键可以唯一标识某一行记录,所以可以确保执行数据更新、删除的时候不会出现张冠李戴的错误。主键除了上述作用外,常常与外键构成参照完整性约束,防止出现数据不一致。数据库在设计时,主键起到了很重要的作用。

    主键可以保证记录的唯一和主键域非空,数据库管理系统对于主键自动生成唯一索引,所以主键也是一个特殊的索引。

 

以上是关于MS SQL 2008 设置主键 该列值为啥还能重复的主要内容,如果未能解决你的问题,请参考以下文章

SQl2008中主键不能等于NULL,可是可以等于null,这是为啥。

如何在 SQL 中显示某一行的列值?

MS SQL SERVER搜索某个表的主键所在的列名

怎样将ms sql的主键设置为每次自增加1

当主键为 varchar 时,无法从 Laravel 的 Eloquent 中检索列值

数据库的五种约束