首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

是否可以从外键引用非主键列?

在关系型数据库中,外键是用来建立表与表之间关系的一种机制。外键通常引用主键列,以确保数据的完整性和一致性。但是,根据数据库的设计和需求,也可以从外键引用非主键列。

引用非主键列的外键称为非主键外键。非主键外键可以用来建立表与表之间的关系,但是需要注意以下几点:

  1. 数据完整性:引用非主键列的外键可能会导致数据完整性的问题。因为非主键列的值可能不是唯一的,可能存在重复值或者空值。这样就可能导致外键关系无法正确建立或者引发数据冗余和不一致的问题。
  2. 查询性能:引用非主键列的外键可能会对查询性能产生影响。因为非主键列上可能没有索引,或者索引的选择性较低,导致查询时需要进行全表扫描或者大量的数据匹配操作。
  3. 设计规范:引用非主键列的外键可能违反一些数据库设计规范。通常情况下,外键应该引用主键列,以确保数据的完整性和一致性。如果需要引用非主键列,需要仔细评估设计的合理性和可行性。

综上所述,虽然可以从外键引用非主键列,但是需要谨慎使用,并且需要根据具体情况评估其对数据完整性和查询性能的影响。在设计数据库时,建议遵循数据库设计规范,将外键引用主键列。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

主键、自增、空....

约束分类: ①空约束 —— 限制该字段的数据不能为null NOT NULL ②唯一约束 —— 保证该字段的所有数据都是唯一、不重复的 UNIQUE ③主键约束—— 主键是一行数据的唯一标识,要求空且唯一...键名称 FOREIGN KEY(字段名) REFERENCES 主表(主表字段名); 的删除/更新行为: NO ACTION:在父表进行更新/删除时,首先检查记录是否存在外,存在则不允许删除...(与NO ACTION行为一致) CASCADE:在父表进行更新/删除时,首先检查记录是否存在外,存在则同时对外关联的子表进行相应的更新/删除 SET NULL:在父表进行更新/删除时,首先检查记录是否存在外...,存在则将关联的字段值设置为null(前提是关联字段可以为null) SET DEFAULT:在父表进行更新/删除时,首先检查记录是否存在外,存在则将关联的字段值设置为一个默认值(Innodb...-- 除了在修改表时添加约束并设定更新/删除行为,还可以在新增表时(方式一)添加并设置。

511100

MySQL数据库——表的约束(空约束、唯一约束、主键约束、约束)

目录 1 表的约束 约束,是对表中的数据进行限定,保证数据的正确性、有效性和完整性,约束分为以下几类: 主键约束:primary key 空约束:not null 唯一约束:unique 约束:foreign...,则代表了空,且唯一; 一张表只能有一个字段为主键主键就是表中记录的唯一标识; 2)创建表时添加主键约束 CREATE TABLE stu( id INT PRIMARY KEY, number...以上仍然存在一个问题,当在员工表中输入不存的部门时,数据依然可以添加,不符合实际,因此,这里就可以通过使用约束来解决。 【概念】什么是约束?...,就是表中与主表主键对应的那一,如:员工表中的dep_id,其中,主表是一方,用来约束别人的表,可以是多方,被别人约束的表。 注意:可以为NULL,但是不能是不存在的键值。 ?...                    constraint 键名称 foreign key (列名称) references 主表名称(主表主键名称)         ); -- 创建部门表

14.3K21
  • 【MySQL】04_约束

    可以作用在多个列上,不与一起,而是单独定义 级约束与表级约束的区别 位置 支持的约束类型 是否可以起约束名 的后面 语法都支持,但没有效果 不可以 所有的下面 默认和空不支持,其他支持 可以...+ 空约束的组合) PRIMARY 约束 限定某个表的某个字段的引用完整性。...例如:学生表、课程表、选课表:选课表的学生和课程要分别参考学生表和课程表,学生表和课程表是主表,选课表是表。 特点: 表的,必须引用/参考主表的主键或唯一约束的。为什么?...,然后才可以删除主表的数据 在“表”中指定约束,并且一个表可以建立多个约束 表的与主表被参照的列名字可以不相同,但是数据类型必须一样,逻辑意义一致。...添加了约束后,表的添加和修改数据受约束 在从表上建立,要求主表必须存在 删除主表时,要求表先删除,或将从表中外引用该主表的关系先删除 约束等级 Cascade方式 :在父表上update

    2.4K20

    MySQL数据库基础练习系列2、图书借阅管理系统

    数据库DDL(注意创建顺序) 为了直接运行DDL语句并创建表,我们需要确保在创建含有约束的表之前,相关的被引用表(即键指向的表)已经存在。...); 插入数据DML(注意插入数据顺序) 插入数据的时候也要注意主外关系,如果没有检的情况下是没有办法插入表数据的。...主键必须完全依赖于主键,而不能只依赖于主键的一部分(针对复合主键而言)。 解释: 第二范式建立在第一范式的基础上,主要关注于主键主键之间的依赖关系。...主键必须直接依赖于主键,不能存在传递依赖。即主键必须直接依赖于整个主键,而不能依赖于主键的一部分。 解释: 第三范式是在第二范式的基础上进一步细化的。...它主要关注于消除传递依赖,即主键不应该依赖于主键的某一部分,而应该直接依赖于整个主键。 如果存在传递依赖,那么应该考虑将这个主键分离出去,形成新的表,并通过主键与原表进行关联。

    20110

    约束

    ,,让某字段在整个表中是唯一的 PRIMARY KEY #主键约束 FOREIGN KEY #约束 CHECK #检查约束 8.0才支持的,5.7还不支持 DEFAULT #默认值约束 空约束 建表的时候给它约束...,可以设置自增列 自增列所在的必须是主键primary key、唯一 unique key) 自增列的数据类型必须是整型类型 当添加数据的时候,如果指定了此列是0,或者null,那么添加成功的时候...FOREIGN KEY约束 约束 约束会涉及到主表和表 主表(父表):被引用的表 表(子表):引用别人的表 表的必须引用主表的主键或者唯一性约束的 在创建的时候,如果不给约束的话...,默认名不是列名,而是自动产生一个键名,当然也可以指定约束名 创建表的顺序,先创建主表,再创建表 删表,先删表,再上主表 表的和主表的列名字可以不相同,但是数据类型必须一样。...在阿里开发规范中:不得使用约束与级联,一切概念必须在应用层解决 CHECK约束 检查模字段的值是否复合要求 MySQL5.7可以支持该约束,但是不起作用。

    80320

    第13章_约束

    ,跟在的定义后面 表级约束:可以作用在多个列上,不与一起,而是单独定义 位置 支持的约束类型 是否可以起约束名 级约束: 的后面 语法都支持,但没有效果 不可以 表级约束...: 所有的下面 默认和空不支持,其他支持 可以主键没有效果) 根据约束起的作用,约束可分为: NOT NULL 空约束,规定某个字段不能为空 UNIQUE 唯一约束,规定某个字段在整个表中是唯一的...PRIMARY KEY 主键 (空且唯一) 约束 FOREIGN KEY 约束 CHECK 检查约束 DEFAULT 默认值约束 注意: MySQL 不支持 check 约束,但可以使用 check...# 6.4 特点 (1)表的,必须引用 / 参考主表的主键或唯一约束的 ​ 为什么?...,需要先删除表中依赖该记录的数据,然后才可以删除主表的数据 (6)在 “表” 中指定约束,并且一个表可以建立多个约束 (7)表的与主表被参照的列名字可以不相同,但是数据类型必须一样,

    37930

    在PowerDesigner中设计物理模型1——表和主外

    单击Columns切换到选项卡,在下面的列表中可以添加表中的。Name是模型上显示的名称,Code是生成的实际的表名,后面的3个复选框P代办主键、F代表,M代表不能为空。...2.选中一个,然后单击工具栏中的“属性”按钮,系统将弹出列属性窗口,在该窗口中可以设置该的各种属性,当然也包括该是否是否主键。另外还有一个很重要的复选框是“Identity”。...另外需要注意的是,在建立主键时,系统会在主键上建立索引,索引分为聚集索引和聚集索引,在“属性”窗口的General选项卡中可以设置该主键上建立的索引是聚集索引还是非聚集索引,如图所示: 如果是由概念模型或者逻辑模型生成物理模型...,那么是通过Relationship生成的,也可以通过工具栏中的Reference来实现两表之间的关系。...”按钮,然后在设计面板中,课程表上按下鼠标左键,并拖拽到教师表中放开鼠标,这时如果课程表中没有RoomID,系统会自动创建RoomID并创建该列上的引用,如果已经存在RoomID,则只添加引用

    2.1K10

    oracle基础|数据库如何设计|数据库的六种范式|数据库的主键|数据库的约束

    ,从而顾客姓名间接的依赖于订单编号,那么这里产生了依赖传递,所以这个设计是不满足第三范式的 三、主键 主键: 1.能做主键必要满足空唯一的特点 2.只要满足空唯一的可以主键 3.可以让表中一个有意义的主键...,比如说学号,它既表示学生学号又作为表中的主键,因为这个满足空唯一的条件 4.也可以找一个没有意义的主键,就是用来唯一标识一行记录的 5.我们可以让多个联合在一起做表中的主键,那么它就是联合主键...,要求这几个的值联合在一起是非空唯一的 : 1.表中的某一个声明为,一般这个的值都会引用于另外一张表的主键的值(有唯一约束的可以,不一定非要引用主键) 2.另外一张表的主键中出现过的值都可以在外中使用...3.值也可以为空的,提前是这个在表中不做主键,因为我们也可以把表中的列当做主键来使用(只有满足空唯一的要求就可以) 4.如果把B表中的联合主键的值引用到A表中做,因为是俩个在B...表中做联合主键,那么A表引用过来的时候也要把俩个的值都引用过来,那么它们在A表中就会作为一个联合出现 四、完整性约束 实体完整性: 引用完整性 级完整性 用户自定义 五、建表 1.映射实体---

    70740

    mysql学习笔记(四)约束与索引

    2.唯一标识··3.关系引用主键 具体体现: 将数据放到表中,表放在库中 一个数据库中可以有多个表,每个表都有一个名字,用来标识自己,表名具有唯一性。...一个表可以有很多的约束 约束需要一个表的两个字段或者两个表的两个字段之间建立约束 约束一定是在从表、子表中建立的。...例如学生表和课程表 表:所在,依赖主表的表。...set null方式:主动权在主表上,如果主表被依赖字段修改了,表的字段会将值设置为Null,这里要求,字段不能有空约束。...set default方式:主动权在主表上,如果主表被依赖字段修改了,表的字段会将值设置为default,这里要求,字段必须有默认约束。

    2K00

    【重学 MySQL】六十六、约束的使用

    主键定义:必须为主表定义主键主键空:主键不能包含空值,但允许在外中出现空值。 匹配:在主表的表名后面指定列名或列名的组合,这个的组合必须是主表的主键。...同时,的数目必须和主表的主键的数目相同。 数据类型一致:的数据类型必须和主表主键的数据类型相同。...约束的特点 表的,必须引用/参考主表的主键或唯一约束的 为什么?...,然后才可以删除主表的数据 在“表”中指定约束,并且一个表可以建立多个约束 表的与主表被参照的列名字可以不相同,但是数据类型必须一样,逻辑意义一致。...我们希望确保每个员工都属于一个存在的部门,因此可以在employee表中为dept_id添加约束,引用department表中的id

    7810

    MySQL数据库基础练习系列15、留言板系统

    数据库DDL(注意创建顺序) 为了直接运行DDL语句并创建表,我们需要确保在创建含有约束的表之前,相关的被引用表(即键指向的表)已经存在。...) 插入数据的时候也要注意主外关系,如果没有检的情况下是没有办法插入表数据的。...主键必须完全依赖于主键,而不能只依赖于主键的一部分(针对复合主键而言)。 解释: 第二范式建立在第一范式的基础上,主要关注于主键主键之间的依赖关系。...主键必须直接依赖于主键,不能存在传递依赖。即主键必须直接依赖于整个主键,而不能依赖于主键的一部分。 解释: 第三范式是在第二范式的基础上进一步细化的。...它主要关注于消除传递依赖,即主键不应该依赖于主键的某一部分,而应该直接依赖于整个主键。 如果存在传递依赖,那么应该考虑将这个主键分离出去,形成新的表,并通过主键与原表进行关联。

    13010

    MySQL删库到跑路_高级(一)——数据完整性

    B、域完整性:限制类型(数据类型),格式(通过检查约束和规则),可能值范围(通过约束,检查约束,默认值定义,空约束和规则)。...每个表最多只允许一个主键,建立主键约束可以级别创建,也可以在表级别上创建。...四、参照完整性 1、参照完整性简介 MySQL参照完整性一般是通过MySQL(foreign key)实现的。 (仅innoDB支持)所引用表的必须是主键。...声明包括三个部分: A、哪个组合是 B、指定参照的表和 C、参照动作[cascade(级联操作),restrict(拒绝操作),set null(设为空),no action,set...如果约束指定了参照动作,主表记录做修改,删除,引用会做相应修改,或不修改,拒绝修改或设置为默认值。 引用表的列名必须是主键,且在删除引用表时必须删除引用关系或者删除当前表。

    1.9K20

    MySQL 约束介绍

    主键约束相当于唯一约束+空约束的组合,主键约束不允许重复,也不允许出现空值 一个表最多只能有一个主键约束 主键约束对应着表中的一或者多 如果是多组合的复合主键约束,那么这些都不允许为空值,...限定某个表的某个字段的引用完整性 表的,必须引用/参考主表的主键或唯一约束的 在创建约束时,如果不给约束命名,默认名不是列名,而是自动产生一个键名(例如student_ibfk_1...;),也可以指定约束名。...创建(CREATE)表时就指定约束的话,先创建主表,再创建表 删表时,先删表(或先删除外约束),再删除主表 表的与主表被参照的列名字可以不相同,但是数据类型必须一样,逻辑意义一致 在“...表”中指定约束,并且一个表可以建立多个约束 当创建约束时,系统默认会在所在的列上建立对应的普通索引,索引名是的约束名,删除外约束后,必须手动删除对应的索引 CREATE TABLE

    1.6K41

    数据库之数据表控制语句

    sex varchar(5), -> info varchar(200) -> ); Query OK, 0 rows affected (0.01 sec) 确定创建的是否主键(该是否有...可以看到其被标识为了主键,但是在创建时并没有指定它是主键,而是这一的属性基本满足了主键的要求,如唯一、不可以为空。...+-------+ 表(sub)的某引用(ref)主表(main)的某的值。...比方学生表有个学生编号(sid),分数表中的学生(stu)引用学生表的学 生编号,此时对于分数表的 stu 来说。学生表的 sid 就是表也叫表,主表也叫主键表、外表,也叫字段。...表2是子表,但不是叫做给表1加入一个,而是给表2加入一个,表2中的学号 字段就叫,它是表1学号字段的主键

    1.1K40

    MySql---复习

    级联操作 格式 测试级联操作 ---- MySQL约束(FOREIGN KEY) MySQL 约束(FOREIGN KEY)用来在两个表的数据之间建立链接,它可以是一或者多。...一个表可以有一个或多个对应的是参照完整性,一个表的可以为空值,若不为空值,则每一个的值必须等于另一个表中主键的某个值。...必须为父表定义主键主键不能包含空值,但允许在外中出现空值。也就是说,只要的每个空值出现在指定的主键中,这个的内容就是正确的。...的数目必须和父表的主键的数目相同,因为有组合主键和组合的数据类型必须和父表主键中对应列的数据类型相同。...REFERENCES 主键1 [,主键2,…] 其中:键名为定义的约束的名称,一个表中不能有相同名称的;字段名表示子表被健约束的字段名;主表名即被子表所依赖的表的名称;主键列表示主表中定义的主键或者组合

    5.2K30

    快速学习-JPA中的一对多

    指的是表中有一,取值参照主表的主键,这一就是。 一对多数据库关系的建立,如下图所示 ?...如果设置为false,则必须始终存在空关系。 @JoinColumn 作用:用于定义主键字段和字段的对应关系。...属性: name:指定字段的名称 referencedColumnName:指定引用主表的主键字段名称 unique:是否唯一。...删除主表数据: 有表数据 1、在默认情况下,它会把字段置为null,然后删除主表数据。如果在数据库的表 结构上,字段有空约束,默认情况就会报错了。...2、如果配置了放弃维护关联关系的权利,则不能删除(与字段是否允许为null, 没有关系)因为在删除时,它根本不会去更新表的字段了。

    1.9K20

    MySQL数据库基础练习3、订单管理系统

    数据库DDL(注意创建顺序) 为了直接运行DDL语句并创建表,我们需要确保在创建含有约束的表之前,相关的被引用表(即键指向的表)已经存在。...-- 约束,确保订单ID的有效性 ); 插入数据DML(注意插入数据顺序) 插入数据的时候也要注意主外关系,如果没有检的情况下是没有办法插入表数据的。...主键必须完全依赖于主键,而不能只依赖于主键的一部分(针对复合主键而言)。 解释: 第二范式建立在第一范式的基础上,主要关注于主键主键之间的依赖关系。...主键必须直接依赖于主键,不能存在传递依赖。即主键必须直接依赖于整个主键,而不能依赖于主键的一部分。 解释: 第三范式是在第二范式的基础上进一步细化的。...它主要关注于消除传递依赖,即主键不应该依赖于主键的某一部分,而应该直接依赖于整个主键。 如果存在传递依赖,那么应该考虑将这个主键分离出去,形成新的表,并通过主键与原表进行关联。

    9710

    mysql系列一

    主键约束(唯一标识) ****空*** ****唯一*** ****被引用****(学习时) * 当表的某一被指定为主键后,该就不能为空,不能有重复值出现。...主键自增长 * 因为主键的特性是:必须唯一、不能为空,所以我们通常会指定主键类为整型,然后设置其自动增长,这样可以保证在插入数据时主键的唯一和空特性。...空约束 * 因为某些不能设置为NULL值,所以可以添加空约束。...约束 * 必须是另一表的主键的值(引用主键!) * 可以重复 * 可以为空 * 一张表中可以有多个!...*****表的主键即是! 8. 数据库多对多关系 在表中建立多对多关系需要使用中间表,即需要三张表,在中间表中使用两个,分别引用其他两个表的主键

    97320

    【MySQL 系列】MySQL 语句篇_DDL 语句

    | NULL] 指示该是否可以为 NULL。...、约束 约束经常和主键约束一起使用,用来确保数据的一致性。...相对于主键而言,用来引用其他表。通过子表的一个或多个对应到父表的主键或唯一键值,将子表的行和父表行建立起关联关系。 例如,Sakila 示例数据库中的 country 表和 city 表。...3.2.1、创建 通常,所属的表被称作子表,被引用的表被称作父表。...它是可选的; 位于 FOREIGN KEY 关键字之后的是作为的列名; 位于 REFERENCES 关键字之后的是被引用的表和; ON DELETE 和 ON UPDATE 指定了删除或更新被引用的表中的数据时要采取的约束策略

    24810
    领券