外键可以为NULL和/或重复吗?

本文翻译自:Can a foreign key be NULL and/or duplicate?

Please clarify two things for me: 请为我澄清两件事:

  1. Can a Foreign key be NULL? 外键可以为NULL吗?
  2. Can a Foreign key be duplicate? 外键可以重复吗?

As fair as I know, NULL shouldn't be used in foreign keys, but in some application of mine I'm able to input NULL in both Oracle and SQL Server, and I don't know why. 据我所知,不应该在外键中使用NULL ,但是在我的某些应用程序中,我能够在Oracle和SQL Server中输入NULL ,但我不知道为什么。


#1楼

参考:https://stackoom.com/question/vMeG/外键可以为NULL和-或重复吗


#2楼

Here's an example using Oracle syntax: 这是一个使用Oracle语法的示例:
First let's create a table COUNTRY 首先,我们创建一个表COUNTRY

CREATE TABLE TBL_COUNTRY ( COUNTRY_ID VARCHAR2 (50) NOT NULL ) ;
ALTER TABLE TBL_COUNTRY ADD CONSTRAINT COUNTRY_PK PRIMARY KEY ( COUNTRY_ID ) ;

Create the table PROVINCE 创建表省

CREATE TABLE TBL_PROVINCE(
PROVINCE_ID VARCHAR2 (50) NOT NULL ,
COUNTRY_ID  VARCHAR2 (50)
);
ALTER TABLE TBL_PROVINCE ADD CONSTRAINT PROVINCE_PK PRIMARY KEY ( PROVINCE_ID ) ;
ALTER TABLE TBL_PROVINCE ADD CONSTRAINT PROVINCE_COUNTRY_FK FOREIGN KEY ( COUNTRY_ID ) REFERENCES TBL_COUNTRY ( COUNTRY_ID ) ;

This runs perfectly fine in Oracle. 这在Oracle中运行得很好。 Notice the COUNTRY_ID foreign key in the second table doesn't have "NOT NULL". 请注意,第二个表中的COUNTRY_ID外键没有“ NOT NULL”。

Now to insert a row into the PROVINCE table, it's sufficient to only specify the PROVINCE_ID. 现在在PROVINCE表中插入一行,仅指定PROVINCE_ID就足够了。 However, if you chose to specify a COUNTRY_ID as well, it must exist already in the COUNTRY table. 但是,如果您还选择指定COUNTRY_ID,则它必须已经存在于COUNTRY表中。


#3楼

我认为一个表的外键也是其他表的主键,所以它不允许空值,所以在外键中没有空值是没有问题的。


#4楼

Yes foreign key can be null as told above by senior programmers... I would add another scenario where Foreign key will required to be null.... suppose we have tables comments, Pictures and Videos in an application which allows comments on pictures and videos. 是的,外键可以为空,如上面的高级程序员所述。...我将添加另一种情况,要求外键为空。...假设我们在允许对图片和图片进行注释的应用程序中具有表注释,图片和视频视频。 In comments table we can have two Foreign Keys PicturesId, and VideosId along with the primary Key CommentId. 在注释表中,我们可以有两个外键PicturesId和VideosId以及主键CommentId。 So when you comment on a video only VideosId would be required and pictureId would be null... and if you comment on a picture only PictureId would be required and VideosId would be null... 因此,当您在视频上发表评论时,仅视频ID是必填项,而pictureId将为null ...,如果您在图片上发表评论,则仅需PictureId,而VideosId将为null ...


#5楼

Simply put, "Non-identifying" relationships between Entities is part of ER-Model and is available in Microsoft Visio when designing ER-Diagram. 简而言之,实体之间的“非识别”关系是ER模型的一部分,并且在设计ER图时在Microsoft Visio中可用。 This is required to enforce cardinality between Entities of type " zero or more than zero", or "zero or one". 这是强制实施类型“零或大于零”或“零或一”的实体之间的基数。 Note this "zero" in cardinality instead of "one" in "one to many". 请注意基数上的此“零”,而不是“一对多”中的“一”。

Now, example of non-identifying relationship where cardinality may be "zero" (non-identifying) is when we say a record / object in one entity-A "may" or "may not" have a value as a reference to the record/s in another Entity-B. 现在,基数可能为“零”(非标识)的非标识关系的示例是当我们说一个实体中的记录/对象时,“可能”或“可能不会”具有一个值作为对记录的引用/ s在另一个实体B中。

As, there is a possibility for one record of entity-A to identify itself to the records of other Entity-B, therefore there should be a column in Entity-B to have the identity-value of the record of Entity-B. 由于实体A的一条记录有可能将自己标识为其他实体B的记录,因此实体B中应有一列具有实体B的记录的标识值。 This column may be "Null" if no record in Entity-A identifies the record/s (or, object/s) in Entity-B. 如果实体A中没有记录标识实体B中的记录(或对象),则此列可以为“ Null”。

In Object Oriented (real-world) Paradigm, there are situations when an object of Class-B does not necessarily depends (strongly coupled) on object of class-A for its existence, which means Class-B is loosely-coupled with Class-A such that Class-A may "Contain" (Containment) an object of Class-A, as opposed to the concept of object of Class-B must have (Composition) an object of Class-A, for its (object of class-B) creation. 在面向对象(现实世界)范式中,某些情况下,B类的对象不一定存在(依赖于(强烈耦合))A类对象,这意味着Class-B与Class-B松散耦合。使得A类可以“包含”(包含)A类对象,而不是B类对象的概念必须具有(Composition)A类对象,因为其(Class-object) B)创作。

From SQL Query point of view, you can query all records in entity-B which are "not null" for foreign-key reserved for Entity-B. 从SQL查询的角度来看,您可以查询实体B中为“实体B”保留的外键“不为空”的所有记录。 This will bring all records having certain corresponding value for rows in Entity-A alternatively all records with Null value will be the records which do not have any record in Entity-A in Entity-B. 这将为实体A中的行带来具有特定对应值的所有记录,或者所有具有Null值的记录将成为实体B中的实体A中没有任何记录的记录。


#6楼

By default there are no constraints on the foreign key, foreign key can be null and duplicate. 默认情况下,外键没有约束,外键可以为null和重复项。

while creating a table / altering the table, if you add any constrain of uniqueness or not null then only it will not allow the null/ duplicate values. 在创建表/更改表时,如果添加任何唯一性约束或不为null,则只有它将不允许null /重复值。

阅读终点,创作起航,您可以撰写心得或摘录文章要点写篇博文。去创作
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据库语言 数据库的简易流程(数据库客户端软件和数据库服务软件的执行流程) 主键的概念 如何创建主键 如何创建外键外键关系的概念以及使用 数据库的主要类型 数据库的主要数据类型 使用SQL语句来创建数据库和表 约束分类 top的使用 Distinct的使用(去除重复数) 聚合函数 聚合函数注意事项 between and 和 in 的使用 like, not like 通配符(%,_,[],^) 空值处理:null 是什么? 排序(order by id asc / desc)(默认是哪一种排序?) 分组(group by ),单条件分组,多条件分组(分组时,要注意的事情[位置,列]) 筛选(Having的使用),它和where的区别 类型转换(CAST,CONVERT) union,union all的使用 一次插入多条数据 字符串函数 ADO.NET主要类 数据库连接字符串 SqlConnection类的State属性 SqlCommand类的方法: StatementCompleted事件的触发 获得刚刚插入数据库的自增id Sql注入攻击(避免方式?) 如何使用迭代生成树形菜单 单例模式(单例模式的创建) DataTable的使用 类SqlDataAdapter的使用(重点) 类SqlCommandBuilder的使用(注意:他必须操作的是有主键的数据库) 提取查询语句,封装SqlHelper类(不仅要会,而且要理解思想) SQL中的Switch语句 SQL中的子查询 SQL中的Exists用法 SQL中的Any SQL中的All SQL2008 微软官方推荐分页方式 SQL中表等值连接(内连接) inner join SQL中表左连接(左外连接) left join SQL中表右连接(右外连接) right join SQL中表交叉连接(两张表的乘积) SQL中表全连接 full join SQL中变量 SQL中的事务 创建存储过程 存储过程带输出参数 调用存储过程 触发器定义 触发器类型: 触发器触发条件: 什么是索引 索引类型 什么是填充因子 什么是临时表 什么是局部临时表 什么是全局临时表 什么是三层结构 三层结构的目的 具体的三层是哪三层 三层之间的关系 三层结构的优缺点 邮件发送方法 Excel导入导出 MD5加密解密方法 读取数据库后,判断dataset里列的值是否为空 项目术语
关系型数据库性能体系,设计和效率提升 1 1 前言 2 1.1目的 2 1.2预期的读者和阅读建议 2 2 数据库模型设计规范 2 2.1 数据库建模原则性规范 2 2.2 实体型之间关系认定规范 2 2.3 范式化1NF的规范 3 2.4 范式化2NF的规范 4 2.5 范式化3NF的规范 4 2.5 反范式化冗余字段使用规范 4 2.6 数据库对象命名基本规范 5 2.6.1遵循行业规范 5 2.6.2简单命名原则 5 2.6.3 字符范围原则 5 2.6.4字母全部大写或小写原则 6 2.6.5勿用保留词原则 6 2.6.5同义性原则 6 2.6.6富有含义原则 6 2.6.7 扩展性原则 6 3 表的设计规范 6 3.1 命名规范 6 3.1.1 表的命名规范 6 3.1.2 字段的命名规范 7 3.2 表的设计规范 7 3.2.1 指定表空间规范 7 3.2.2 表的主键规范 7 3.2.3 表的外键规范 8 3.2.4 字段类型及宽度的规范 8 3.2.5 一个表所含字段总长度的规范 8 3.2.6 一个表所含字段访问频繁度的规范 8 3.2.7 大对象字段(BLOB,CLOB)使用规范 9 3.2.8 关于字段能否为NULL值 9 3.2.9 关于冗余列的规范 9 3.2.10 使用注释的规范 9 3.2.11 一个表所含数据量的规范 10 3.2.12 增量同步表的设计规范 10 3.3 字段类型规范 10 3.3.1 不使用会发生隐式转换:INTEGER,FLOAT 10 3.3.2 不使用过时老类型:RAW,LONG,LONG RAW 10 3.3.3 国家字符集相关 10 3.3.4 不能使用大对象:BLOB,CLOB,NCLOB 11 3.3.5 不能使用高精度:TIMESTAMP 11 3.3.6 关于CHAR字段 11 4 分区表的设计规范 11 4.1 表空间及分区表的概念 11 4.1.1 表空间 11 4.1.2 分区表 11 4.2 表分区的具体作用 11 4.3 表分区的优缺点 12 4.4 分区表设计规范 12 4.2.1 不使用全局索引 12 4.2.2 RANGE分区的规范 12 4.2.3 LIST分区的规范 13 4.2.4 HASH分区的规范 13 4.2.5 RANGE-LIST分区的规范 14 4.2.6 RANGE-HASH分区的规范 14 5 索引的设计规范 15 5.1 索引分类 15 5.1.1单列索引与复合索引 15 5.1.2 唯一索引与非唯一索引 15 5.1.3 B树索引、位图索引与函数索引 15 5.2 命名规范 15 5.3 索引设计规范 15 5.3.1 指定表空间规范 16 5.3.2 主键索引的规范 16 5.3.3 唯一约束索引的规范 17 5.3.4 外键列索引的规范 17 5.3.5 复合索引的规范 17 5.3.6 函数索引的规范 17 5.3.7 位图索引的规范 18 5.3.8 反向索引的规范 18 5.3.9 分区索引的规范 18 5.3.10 索引重建的规范 18 6 其他数据库对象设计规范 18 6.1 命名规范 18 6.2 视图设计规范 19 6.2.1 尽量使用简单的视图,避免使用复杂的视图 19 6.2.2 按照必要性原则建立视图 19 6.3 存储过程、函数、触发器的设计规范 19 6.3.1 关于触发器的设计 19 7 SQL访问规范 20 7.1 尽量不要写复杂的SQL 20 7.2 避免使用SELECT * 20 7.3 INSERT时需写全列名 20 7.4 进行DML操作时使用CTAS进行数据备份 20 7.5 大数据量DML操作分多次执行 21 7.6 使用绑定变量,降低高硬解析 21 7.7 选择最有效率的表名顺序 21 7.8 关注WHERE子句中的连接顺序 21 7.9 用EXISTS替代IN 22 7.10 用表连接替换EXISTS 23 7.11用EXISTS替换DISTINCT 24 7.12 尽量用union all替换union 24 7.13 使用DECODE函数来减少处理时间 24 7.14 尽量避免用order by 25 7.15 用Where子句替换HAVING子句 25 7.16 减少多表关联 25 7.17 避免重复访问 26 7.17.1 使用group by 26 7.17.2 用表更新表 26 7.17.3竖向显示变横向显示 26 7.18 完成事务及时commit 27 7.19数据库连接及时关闭 27 7.20 索引的使用 27 7.20.1避免在索引列上使用函数或运算 27 7.20.2避免改变索引列的类型 28 7.20.3避免在索引列上使用NOT 28 7.20.
主键是在数据库表中用来唯一标识每一行数据的字段。主键具有以下特点:一张表中主键是唯一的,主键不能为空。如果一个表中的字段不能作为唯一标识每一行数据时,可以选择多个字段作为联合主键。联合主键的特点是,如果去掉联合主键中的某个字段,剩下的字段仍然可以构成联合主键,否则说明之前的联合主键是错误的。\[1\] 外键是子表中对应于主表的列,用来建立表与表之间的关系。外键的值要求与主表的主键或唯一键相对应,用来强制引用完整性。一个表可以有多个外键。例如,在成绩表中,学号可以作为外键,与学生表中的学号关联。外键可以有重复的值,也可以是空值。\[2\]\[3\] 在数据库中,主键和外键的声明可以通过在表的字段声明中指定相应的约束来实现。主键约束用于声明主键字段,外键约束用于声明外键字段。通过这样的声明,数据库系统可以确保主键的唯一性和外键的引用完整性。 #### 引用[.reference_title] - *1* *2* [数据库的完整性:主键和外键](https://blog.csdn.net/Peakednes/article/details/106501136)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [数据库的主键与外键](https://blog.csdn.net/YangYanDong666/article/details/89070881)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值