精华内容
下载资源
问答
  • 外键必须是另一个表主键

    千次阅读 2019-03-01 14:48:49
    外键 (FK) 是用于建立和加强两个表数据之间的链接的一列或多列。当创建或修改时可通过定义 FOREIGN KEY 约束来创建外键。 外键引用中,当一个表的列被引用作为另一个表的主键值的列时,就之间创建了链接...

    不一定是主键,但必须是唯一性索引。

    主键约束和唯一性约束都是唯一性索引。

     

     

    FOREIGN KEY 约束

    SQL Server 2008

    其他版本

    外键 (FK) 是用于建立和加强两个表数据之间的链接的一列或多列。当创建或修改表时可通过定义 FOREIGN KEY 约束来创建外键。

    在外键引用中,当一个表的列被引用作为另一个表的主键值的列时,就在两表之间创建了链接。这个列就成为第二个表的外键。

    例如,因为销售订单和销售人员之间存在一种逻辑关系,所以 AdventureWorks 数据库中的 Sales.SalesOrderHeader 表含有一个指向Sales.SalesPerson 表的链接。SalesOrderHeader 表中的 SalesPersonID 列与 SalesPerson 表中的主键列相对应。SalesOrderHeader 表中的SalesPersonID 列是指向 SalesPerson 表的外键。

    SalesOrderHeader.SalesPersonID 为外键。

    FOREIGN KEY 约束并不仅仅可以与另一表的 PRIMARY KEY 约束相链接,它还可以定义为引用另一表的 UNIQUE 约束。FOREIGN KEY 约束可以包含空值,但是,如果任何组合 FOREIGN KEY 约束的列包含空值,则将跳过组成 FOREIGN KEY 约束的所有值的验证。若要确保验证了组合 FOREIGN KEY 约束的所有值,请将所有参与列指定为 NOT NULL。

    注意 注意

    FOREIGN KEY 约束可以引用同一数据库的表中的列或同一表中的列。这些称为“自引用”表。例如,请考虑包含三列的一个雇员表:employee_numberemployee_name 和 manager_employee_number。由于经理本身也是雇员,所以从manager_employee_number 列到 employee_number 列存在外键关系。

     

    引用完整性

    尽管 FOREIGN KEY 约束的主要目的是控制可以存储在外键表中的数据,但它还可以控制对主键表中数据的更改。例如,如果在 Sales.SalesPerson表中删除一个销售人员行,而这个销售人员的 ID 由 Sales.SalesOrderHeader 表中的销售订单使用,则这两个表之间关联的完整性将被破坏;SalesOrderHeader 表中删除的销售人员的销售订单因为与 SalesPerson 表中的数据没有链接而变得孤立了。

    FOREIGN KEY 约束防止这种情况的发生。如果主键表中数据的更改使之与外键表中数据的链接失效,则这种更改将无法实现,从而确保了引用完整性。如果试图删除主键表中的行或更改主键值,而该主键值与另一个表的 FOREIGN KEY 约束中的值相对应,则该操作将失败。若要成功更改或删除 FOREIGN KEY 约束的行,必须先在外键表中删除或更改外键数据,这将把外键链接到不同的主键数据上去。

     

    对 FOREIGN KEY 约束建立索引

    由于以下原因,对外键创建索引通常是有用的:

    • 对 PRIMARY KEY 约束的更改可由相关表中的 FOREIGN KEY 约束检查。

    • 当在查询中组合相关表中的数据时,经常在联接条件中使用外键列,方法是将一个表的 FOREIGN KEY 约束中的列与另一个表中的主键列或唯一键列匹配。索引使 数据库引擎可以在外键表中快速查找相关数据。但是,创建此索引并不是必需的。即使没有对两个相关表定义 PRIMARY KEY 或 FOREIGN KEY 约束,也可以对来自这两个表中的数据进行组合,但两个表间的外键关系说明已用其键作为条件对其进行了优化,以便组合到查询中。有关在联接中使用 FOREIGN KEY 约束的详细信息,请参阅联接基础知识查询类型和索引

     

    表中的 FOREIGN KEY 约束数

    SQL Server 对一个表可以包含的 FOREIGN KEY 约束(引用其他表)数没有预定义限制,对引用特定表的其他表所拥有的 FOREIGN KEY 约束数也没有预定义的限制。但是,实际的 FOREIGN KEY 约束数会受到硬件配置以及数据库和应用程序的设计的限制。建议表中包含的 FOREIGN KEY 约束不要超过 253 个,并且引用该表的 FOREIGN KEY 约束也不要超过 253 个。在设计数据库和应用程序时应考虑强制 FOREIGN KEY 约束的开销。

     

    请参阅

    参考

    CREATE TABLE (Transact-SQL)

    ALTER TABLE (Transact-SQL)

    DROP TABLE (Transact-SQL)

    概念

    创建和修改 FOREIGN KEY 约束

    索引

    展开全文
  • mysql 创建的时候,一个属性创建自动增长的时候 这键必须是主键

    mysql 在创建表的时候,在给一个属性创建自动增长的时候 这个键必须是主键

    展开全文
  • 主键:唯一标识中的所有行的一个列主键不允许空值。不能存在具有相同的主键值的两行,因此主键值总是唯一标识单个行。中可以有不止一个键唯一标识行,每键都称作候选键。只有一个候选键可以选作...

    什么是一个表的外键 他和主键有什么区别吗/?主键:唯一标识表中的所有行的一个列或一组列。主键不允许空值。不能存在具有相同的主键值的两个行,因此主键值总是唯一标识单个行。表中可以有不止一个键唯一标识行,每个键都称作候选键。只有一个候选键可以选作表的主键,所有其它候选键称作备用键。尽管表不要求具有主键,但定义主键是很好的做法。 在规范化的表中,每行中的所有数据值都完全依赖于主键。例如,在以 EmployeeID 作为主键的规范化的 employee 表中,所有列都应包含与某个特定职员相关的数据。该表不具有 DepartmentName 列,因为部门的名称依赖于部门 ID,而不是职员 ID。 外键:外键 (FK) 是用于建立和加强两个表数据之间的链接的一列或多列。通过将保存表中主键值的一列或多列添加到另一个表中,可创建两个表之间的链接。这个列就成为第二个表的外键。 Create database cat go use cat go CREATE TABLE s(s# int not null primary key,s_name varchar(8) not null) go CREATE TABLE c (c# int not null primary key,c_name varchar(8) not null) go CREATE TABLE cs(c# int not null,s# int not null,cj tinyint not null default(0), primary key (c#,s#),foreign key(s#) references s(s#),foreign key(c#) references c(c#)) go insert s values(1,’saa’) insert c values(1,’caa’) --这句是对的 insert cs values(1,1,86) --这句是错的,sql会报错,应为s表的s#列里没有2 insert cs vlaues(2,1,45) 定义主键来强制不允许空值的指定列中输入值的唯一性。如果在数据库中为表定义了主键,则可将该表与其它表相关,从而减少冗余数据。表只能有一个主键。 外键。 当创建或更改表时可通过定义 FOREIGN KEY 约束来创建外键。 例如,数据库 pubs 中的 titles 表与 publishers 表有链接,因为在书名和出版商之间存在逻辑联系。titles 表中的 pub_id 列与 publishers 表中的主键列相对应。titles 表中的 pub_id 列是到 publishers 表的外键。 FOREIGN KEY 约束并不仅仅只可以与另一表的 PRIMARY KEY 约束相链接,它还可以定义为引用另一表的 UNIQUE 约束。FOREIGN KEY 约束不允许空值,但是,如果任何组合 FOREIGN KEY 约束的列包含空值,则将跳过 FOREIGN KEY 约束的校验。 主键是本表的唯一标识,而外键是与另一个表相关联 

    展开全文
  • 以前建立自增主键都是用mysql建的,只要写 auto_increment就行了,最近因为工作,需要用到PostgreSQL的自增主键,就去了解了下。发现网上的这点东西写的真乱…就没有说是整整齐齐从头到尾说清楚的,没有就只能我...

          
          以前建立自增主键都是用mysql建的,只要写个 auto_increment就行了,最近因为工作,需要用到PostgreSQL的自增主键,就去了解了下。发现网上的这点东西写的真乱…就没有个说是整整齐齐从头到尾说清楚的,没有就只能我自己写了…
          首先,pgsql没有auto_increment这么一说,所以想要建立自增主键就得想想其他办法了

    一、 准备工作

          首先创建一张表:

    create table test(
    	id int primary key,
    	age int
    )
    

          

    二、 第一种方法----创建序列达到自增的效果

    1. 创建序列

          pgsql里,有种东西叫自增,很像mysql里的约束。建立一个自增的序列,每次需要获取自增主键时,调用一下这个序列就可以了。
          建立自增主键的序列的语法:

    CREATE SEQUENCE 
    test_id_seq
    INCREMENT 1
    MINVALUE 1
    MAXVALUE 9223372036854775807
    START WITH 1
    CACHE 1; 
    

          
          INCREMENT BY : 每次序列增加(或减少)的步长
          MINVALUE : 序列最小值,NO MINVALUE表示没有最小值
          MAXVALUE : 序列最大值,NO MAXVALUE表示没有最大值
          START WITH :以什么序列值开始
          CYCLE : 序列是否循环使用
          OWNED BY : 可以直接指定一个表的字段,也可以不指定。
          
          需要自增主键的时候,调用nextval(序列名)就可以了:

    test=#  select nextval('test_id_seq');
     nextval
    ---------
           1
    

    2. 序列的相关方法

          相关的方法如下(regclass 表示序列的名称):

    函 数 返 回 类 型 描 述
    currval( regclass ) bigint 获取指定序列最近一次使用netxval后的数值,如果没有使用nextval而直接使用currval会出错。
    lastval() bigint 返回最近一次用 nextval 获取的任意序列的数值
    nextval( regclass ) bigint 递增序列并返回新值
    setval( regclass,bigint ) bigint 设置序列的当前数值
    setval( regclass,bigint ,boolean ) bigint 设置序列的当前数值以及 is_called 标志,如果为true则立即生效,如果为false,则调用一次nextval后才会生效

          需要什么值就去找具体的函数就行了。

    3. 插入数据

          假设现在要向test表中插入数据,id自增,则:

    insert into test values(
    	nextval('test_id_seq') , 1 
    )
    

          但是这种操作,每次都得写一遍序列名,很烦。不过有办法解决。看下面:

    4. 设置默认值

          可以设置id字段的默认值为nextval('test_id_seq'),这样插入数据就不用每次都写一遍了。

    alter table 
    	test -- 表名
    alter column 
    	id -- 列名 
    set default nextval(
    	'test_id_seq'  -- 序列名
    );
    

          再向test表中插入数据,这样写就行了:

    insert into test(age) values(12)
    

          或者直接:

    insert into test values(12)
    

          

    三、第二种方法----使用SERIAL

    1. 建表语句

          使用serial时,建表语句需要改一下:

    create table test(
    	id serial primary key,
    	age int
    )
    

          这时候,会自动创建名为表名_字段名_seq的序列,且MAXVALUE=9223372036854775807,其余值为1。
          例如,建立上表以后,则自动创建出名为test_id_seq的序列。
          

    2. 插入数据

          插入数据,这样写就行了:

    insert into test(age) values(12)
    

          或者直接:

    insert into test values(12)
    

          

    3. 如何获取序列的当前值

          使用如下sql可以获取序列当前值:

    select currval('test_id_seq')
    

          一些其他情况可以看这里: 如何获取序列当前值?以及如何解决相关报错

    展开全文
  • 因为主键起始从实现角度来看是一个 唯一 非空 聚类索引, 聚类索引在一个表中只有一个,所以主键只有一个。至于为什么聚类索引在一个表中只有一个是因为聚类索引的数据物理顺序和索引排序方式一致,而物理存储...
  • 建立外键的时候发生了这样的错误,猜测可能是跟主键有关系我的语句是这么写的: constraint for_score_students foreign key(studentid) references students(studentid)错误提示了红色s处说明: 1 这句语句...
  • 数据合并等操作中有不可替代的优势但是由于普通的GUID的分散性使得如果主键加上聚集索引(Clustered Index)会导致插入记录时效率大大降低SQL SERVER 2005中新增了一个NEWSEQUENTIALID的函数,MSDN的解释是:...
  • 关系数据库表主键和外键

    千次阅读 2013-08-03 15:31:20
    关系型数据库中的条记录中有若干属性,若其中某一个属性组(注意是组)能唯一标识条记录,该属性组就可以成为一个主键  比如  学生(学号,姓名,性别,班级)  其中每学生的学号是唯一的,学号就是一个...
  • MySQL为什么需要一个主键(自增长)

    千次阅读 2016-06-07 08:41:11
    MySQL为什么需要一个主键(自增长)
  • **************** ...创建学生: 第种: create table student (sno char(5) primary key,/*学号*/ /*可以直接指定主键*/ sname char(20) not null,/*姓名*/ ssex char(3) not null,
  • 逻辑主键、业务主键和复合主键

    千次阅读 2018-07-17 00:09:49
    外键(FOREIGN KEY):外键 (FK) 是用于建立和加强两个表数据之间的链接的一列或多列。外键引用中,当一个表的列被引用作为另一个表的主键值的列时,就之间创建了链接。这列就成为第二个表的外键。 聚集...
  • 定义(部分定义来源于 SQL Server 联机丛书)...外键(FOREIGN KEY):外键 (FK) 是用于建立和加强两个表数据之间的链接的一列或多列。外键引用中,当一个表的列被引用作为另一个表的主键值的列时,就之间创建了
  • 什么是外键,什么是主键表

    千次阅读 2017-03-17 17:04:42
    表1属性有:typeid(主键...表1是主键表、表1的主键字段在表2中做外键、而表1自己却没有外键表2是外键表有一个依赖表1typeid的字段、作为外键、取值必须是其依赖主键表表1中主键字段有的值 ---------------------------
  •  每了解数据库设计的人都知道,主键对于一张来说是一个很重要,甚至必需的部分。这确实是事实,主键是好的数据库设计的部分。主键是数据库确保数据行整张唯一性的保障。它是定位到条记录并且确保不会...
  • 一个表只能一个聚集索引,数据物理是按照聚集索引的顺序来存放的。 主键分为聚集的主键和非聚集的主键。默认是聚集的主键。如下图: /****** Object: Table [dbo].[User] Script Date: 03/28/2014
  • 主键约束自动建立索引问题

    千次阅读 2013-06-17 16:32:49
    约束用于确保数据库数据的完整性,oracle数据库中,可以使用约束,触发器和应用代码(过程,函数)3种方法实现数据完整性,这3种方法中,因为约束易于维护,并且具有最好的性能,所以实现数据完整性首选约束.     ....
  • Oracle主键约束自动建立索引问题

    千次阅读 2014-10-14 15:00:26
    约束用于确保数据库数据的完整性,Oracle数据库中,可以使用约束,触发器和应用代码(过程,函数)3种方法实现数据完整性,这3种方法中,因为约束易于维护,并且具有最好的性能,所以实现数据完整性首选约束.   .约束...
  • 后面跟其他数据库做对比的时候,这是其中一个点(关系型数据库) 把本文的区别搞清楚就行了,进公司就一点问题没有。 本文解决问题:主键与外键的纠葛 先来看看主键与外键的来源吧: 1、主键约束( PRIMARY ...
  • 数据库的主键表和外键

    千次阅读 2013-03-24 11:06:33
    想写这是因为自己刚好尝试建一个数据库,而数据库的各个之间的关系不是很清楚,没有形成一个整体的关系,所以就尝试着将数据库形成一个整理的关系,我 敢说很多跟我一样的同学原来做课程设计,肯定就是随便...
  • 主键和索引的区别

    千次阅读 2019-01-31 09:51:44
    这样的一列或多列称为主键 (PK),用于强制的实体完整性。创建或修改时,您可以通过定义 PRIMARY KEY 约束来创建主键。 一个表只能有一 PRIMARY KEY 约束,并且 PRIMARY KEY 约束中的列不能接受空值。...
  • MySQL的几概念:主键,外键,索引,唯一索引主键(primary key) 能够唯一标识中某一行的属性或属性组。一个表只能有一个主键,但可以有...外键(foreign key) 是用于建立和加强两个表数据之间的链接的一列或多列。
  • 今天做数据库作业时,发现了问题,我不小心忘了写主键约束,查了书籍,全都是插入数据时写的约束,上网找到了一个解决方案试验后找到了它的公式。 alter table 需要插入主键的表名 add primary key(列名); 这...
  • 如果由两个列共同组成主键,而且个子主键作为可为空值的外键来继承,就可能得到错误的数据。可在一个外键中插入有效的值,但一个外键中插入空值。然后,可添加一个数据检查约束,可为空的外键中...
  • SQL 主键和索引的区别

    万次阅读 多人点赞 2018-04-01 10:18:21
    (1)创建时,不能一个字段上建立索引(主键默认建立唯一索引),需要经常查询的字段上建立索引(如:deal_id已经是主键,不能再次执行:create index tmp_table_index on tmp_table(deal_id),会报错);...
  • SQL主键、外键、索引设计

    千次阅读 2009-12-08 22:04:00
    基本设计中,主键、外键、索引设计占有非常重要的地位,但系统设计人员往往只注重于满足用户要求,而没有从系统优化的高度来认识和重视...一个表只有一个主键主键应该有固定值(不能为Null或缺省值,要有相对
  • 主键、聚集索引、非聚集索引区别

    千次阅读 2020-07-14 10:59:36
    一个表最多一个主键 一个表最多一个聚集索引 是否允许多字段来定义 一个主键可以多字段来定义 一个索引可以多字段来定义 是否允许 null 数据行出现 如果要创建的数据中数据...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 79,640
精华内容 31,856
关键字:

一个表的主键只能建立在一列上