首先楼主要明白不同表中的相同字段是没有任何关系的 ,然后也没看到你的B表
你的问题:你的第一个问题你自己不觉得是自相矛盾吗?
A表中的主键是B表的外键,那么这个外键在B表中可以是主键吗? 这句话你的意思就相当于问 主键和外键可以是一个字段吗? 那么回答肯定是否定的 。一个字段要么是主键 要么是外键 不可能又是主键又是外键 ,然后主键和主键是同一级别的 没有谁约束谁,只有主键可以约束外键,然后我给楼主讲解一下主外键的关系,不要死记硬背定义,要理解。
比如a表的主键 如果是b表的外键的话 那么这个外键的每一个值都必须在a的主键里存在,如果b的这个外键定义可以为空的话,那么b这个外键的值只有两个情况:要么值在a的主键里选,要么为空。
就这么简单的一句话。
外键(FK)是用于建立和加强两个表数据之间的链接的一列或多列。通过将保存表中主键值的一列或多列添加到另一个表中,可创建两个表之间的链接。这个列就成为第二个表的外键。
当创建或更改表时可通过定义 FOREIGN KEY 约束来创建外键。
例如,数据库 pubs 中的 titles 表与 publishers 表有链接,因为在书名和出版商之间存在逻辑联系。
titles 表中的 pub_id 列与 publishers 表中的主键列相对应。titles 表中的 pub_id 列是到 publishers 表的外键。
扩展资料:
保持数据一致性,完整性,主要目的是控制存储在外键表中的数据。 使两张表形成关联,外键只能引用外表中的列的值或使用空值。
学号在成绩表(表2)中是主键,在学生表(表1)中是外键。如果不使用外键,表1的学号字段插了一个值(比如20140999999),但是这个值在表2中并没有,这个时候,数据库允许插入,并不会对插入的数据做关系检查。
然而在设置外键的情况下,插入表1学号字段的值必须要求在表1的学号字段能找到。 同时,如果要删除表2的某个学号字段,必须保证表2中没有引用该字段值的列,否则就没法删除。
这就是所谓的保持数据的一致性和完整性。如右图,如果表1还引用表2的某个学号,却把表1中的这个学号删了,表2就不知道这个学号对应的学生是哪个学生。
参考资料:
看提示你应该已经创建了COURSE表了,错误提示显示你在COURSE表中定义cno字段的长度与SC表不一样,从上面的看到SC表的cno的类型是char(4),请检查COURSE表的字段类型是否也为char(4),这个字段类型需要保持一致。
数据库中外键的类型长度需要与被引用表的相应字段的类型及长度相同。
索引是index
语法:
create [索引类型] index 索引名称
on 表名(列名)
with fillfactor = 填充因子值0~100
GO
键:唯一标识表中的所有行的一个列或一组列。
主键不允许空值。不能存在具有相同的主键值的两个行,因此主键值总是唯一标识单个行。
表中可以有不止一个键唯一标识行,每个键都称作候选键。只有一个候选键可以选作表的主键,所有其它候选键称作备用键。尽管表不要求具有主键,但定义主键是很好的做法。
外键(FK):
是用于建立和加强两个表数据之间的链接的一列或多列。通过将保存表中主键值的一列或多列添加到另一个表中,可创建两个表之间的链接。这个列就成为第二个表的外键。
例如:成绩表中的学号不能做成绩表的主键(因为一个学生可以有多行成绩数据),但每行的学号和学生表中的学号相对应,并且学生表中的学号是学生表的主键,则称成绩表中的学号是学生表的外键
。(典型的一对多关系)
我的问题解决,是因为数据表中的记录不是一一对应的,经过清空或者删除不对应的数据记录,建立了关系,建议你 *** 作如下:
数据表结构一致性检查:必须清空或者整理两张表的数据,保证一对一,空对空;保证两张表主键和外键的类型相同,int=>int,smallint=>smallint等等,非空对非空
检查是否已经存在外键关系,存在就改关系名
建议删除原表,重新建立新表重做关系
外键是该表是另一个表之间联接的字段(外键必须为另一个表中的主键)
外键的用途是确保数据的完整性。它通常包括以下几种:
实体完整性,确保每个实体是唯一的(通过主键来实施)
域完整性,确保属性值只从一套特定可选的集合里选择
关联完整性,确保每个外键或是NULL(如果允许的话)或含有与相关主键值相配的值
如果你在没有定义数据库的实际外键的情况,试图强制执行关联完整性,那你就会遇到数据库“断列链接”或“孤单记录”的风险。换句话说,数据的完整性会被破坏,你的数据库会含有不良数据,你的用户会很生气(或更糟)。
你从来不能肯定你的前台程序是更改数据库数据的唯一手段。那是太危险了。此外,你在已经建好的数据库上花费不必要及大量的时间和精力来生成逻辑。你在没有合理理由的情况下再发明轮子。
从来不存在“太多的”外键。 或者是业务需求需要的, 或者不需要。如果需要(例如,确保每个定单归属于一个已知的客户),那你必须实施它们。性能不是问题。不进行外键检查,你的查寻可能会快几微微秒,但如果数据库包含不良数据,你的用户会容忍这样的情况持续多久呢?
比如在员工信息表中有部门的编号,部门的信息在另外一个表中,在部门信息表中这个部门编号必须是存在的或者为空,而不能是一个不存在的部门编号。
这个就可以使用外键来限制员工信息表的部门编号的外键为部门信息表的部门编号,这样Oralce就可以自动完成员工信息表中的部门编号必须存在了。
以上就是关于SQL 数据库 外键全部的内容,包括:SQL 数据库 外键、数据库中的外键是什么意思、外键 'FK__P_P__P#__2C3393D0' 引用了位于被引用表 'part' 中的无效列 'P#'。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)