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

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

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

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

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

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

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

相关·内容

主键、自增、空....

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

369100

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

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

13.4K21

【MySQL】04_约束

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

2.4K20

约束

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

75820

第13章_约束

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

31130

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

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

65540

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

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

2K10

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

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

1.9K20

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

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

1.9K00

MySQL 约束介绍

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

1.6K41

快速学习-JPA中的一对多

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

1.9K20

数据库之数据表控制语句

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

mysql系列一

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

94920

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

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

10410

mysql常见的建表选项和约束

可以通过该表查询约束信息 常见的约束类型 not null空,指定某不为空(注意区分空和空格的关系) unique:唯一约束,指定某和几列组合的数据不能重复 primary key:主键约束,指定某的数据不能重复...constraint pk_id_name primary_key(id,name) constraint可以进行重命名,但是在数据字典中,主键名还是显示primary foreign key约束...参照完整性约束,保证一个或两个表之间的参照完整性,是构建于一个表的两个字段或者是两个表的两个字段之间的参照关系 注意: 具有约束的的值不能随便给,必须满足引用主键的取值 一张表中可以定义多个...默认可以给null值 父子表 所在的表叫做子表,引用主键所在的表叫做父表,主表 constraint emp_deptid_fk foreign_key(deptid) references...null 引用定义 reference_definition: REFERENCES tbl_name (index_col_name,...)

10610

linux 之mysql——约束(constraint)详解

或者必须注册的时候需要添加邮箱等  三、约束种类 空约束(not null)  唯一性约束(unique) 主键约束(primary key) PK 约束(foreign key) FK 四、空约束...,专门用来自动生成主键值,主键值不用用户维护,自动生成,自增数1开始,以1递增(auto_increment)  mysql> create table t_user( -> id int(10...单一:给一个字段添加约束 复合:给多个字段联合添加一个约束 4、一张表可以有多个字段(与主键不同)  建立两个表,学生表,和班级表 学生表(添加单一) sno(pk)...  注意要点: 键值可以为null 字段去引用一张表的某个字段的时候,被引用的字段必须具有unique约束 有了引用之后,表分为父表和子表 班级表:父表 学生表:子表 创建先创建父表 删除先删除子表数据...:如果父表中的记录被删除,则子表中对应的记录自动被删除 父表——被引用的表 子表——引用父表中的健作为健的表 on delete set null  表的关联的值设置为null  alter table

2.4K20

SQL基础--> 约束(CONSTRAINT)

KEY 主键约束P 唯一的标识出表的每一行,且不允许空值值,一个表只能有一个主键约束 FOREIGN KEY 约束R 一个表中的引用了其它表中的,使得存在依赖关系,可以指向引用自身的...:CHECK 条件约束 何时创建约束: 建表的同时 建表之后 可以在表级或级定义约束 级约束:只能引用一个并且它属于定义的一部分,可定义成任意类型的完整性约束。...–使用SYSDATE, UID, USER, 和USERENV 函数 –在查询中涉及到其它的值 FOREIGN KEY 约束 约束是用来维护从表和主表的引用完整性的,所以外约束要涉及两个表...约束对delete语句的影响: 删除主表数据时,如果表有对该数据的引用,要先将从表中的数据处理好。主表才有可能违反约束。...CONSTRAINT ck_cons2_comm; 8.删除约束: SQL> ALTER TABLE tb_cons2 2 DROP CONSTRAINT uk_tb_cons2_email; 使用下面的方法可以级联删除主表主键表的

1.7K20
领券