外键值可为空

2024-03-13 06:58
文章标签 键值 可为

本文主要是介绍外键值可为空,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原文地址:http://blog.csdn.net/bisal/article/details/49706273

从感官上,外键用于限制主子表的关联关系,是一种强关联关系,那么子表的外键值不应该为空,而是都会关联到主表对应的记录上,但实际上,至少在Oracle中,外键是可以为空的,打个比方,班级是主表,学生是子表,一个班级有多名学生,一名学生肯定会关联到一个存在的班级,但来了一个转校生,还没有分班,他现在属于学生子表,但还没有关联到班级主表中的任何一条记录。

实验: 
1.创建主表T_A,子表T_B,子表A_ID列作为外键关联到主表T_A的主键ID字段。

SQL> create table t_a(
id number, name varchar2(1));Table created.SQL> alter table t_a add constraint pk_t_a primary key(id);Table altered.SQL> create table t_b(id number, a_id number, name varchar2(1));Table created.SQL> alter table t_b add constraint pk_t_b primary key(id);Table altered.SQL> alter table t_b add constraint fk_b_a foreign key(a_id) references t_a(id);Table altered.

2.插入记录,其中T_B表的一条记录标明A_ID字段值为空。

SQL> insert into t_a values(1, 'a');1 row created.SQL> insert into t_b values(1, 1, 'b');1 row created.SQL> insert into t_b values(2, '', 'c');1 row created.SQL> select * from t_a;ID N
---------- -1 aSQL> select * from t_b;ID       A_ID N
---------- ---------- -1          1 b2            c

可以插入,说明外键字段是可以为空。

3.直接删除有关联子表记录的主表记录时,会报错: 

SQL> delete from t_a where id=1; 
delete from t_a where id=1 
* 
ERROR at line 1: 
ORA-02292: integrity constraint (BISAL.FK_B_A) violated - child record found

4.先删除子表记录,再删除主表对应的记录,则可以执行。

SQL> delete 
from t_b where id=1;1 row deleted.SQL> delete from t_a where id=1;1 row deleted.

这篇关于外键值可为空的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/803988

相关文章

Golang基于内存的键值存储缓存库go-cache

《Golang基于内存的键值存储缓存库go-cache》go-cache是一个内存中的key:valuestore/cache库,适用于单机应用程序,本文主要介绍了Golang基于内存的键值存储缓存库... 目录文档安装方法示例1示例2使用注意点优点缺点go-cache 和 Redis 缓存对比1)功能特性

Redis 命令不区分大小写,键值区分大小写Redis

今天才知道   Redis 命令不区分大小写   但键值区分大小写的

golang 无序的键值对集合map

这个demo很好。 package mainimport "fmt"func main() {/*创建集合并初始化 */countryCapitalMap := make(map[string]string)/* map插入key - value对,各个国家对应的首都 */countryCapitalMap [ "France" ] = "巴黎"countryCapitalMap [ "Ital

OkHttp学习(1)--同步和异步(get、post键值对、post带map、请求头体封装json)

之前学习过Volley的种种用法,点击如下链接可以参考 如果想对Volley有所了解,可以看我这5篇关于Volley的实践代码 今天来学习下OkHttp的学习,这篇博客主要是来了解OkHttp同步和异步—(get、post键值对、post带map、请求头体封装json) 下一篇去了解文件上传、图片下载 为了快速使用,没有去研究源码了,但是看过Volley的源码,我感觉本质上也是想通的,就直

一篇搞懂C++ STL 存储重复键值对容器std::multimap

文章目录 前言为什么使用 `std::multimap``std::multimap` 与 `std::map` 的区别字符串图表示区别`std::multimap` 的构造函数和操作函数构造函数成员函数 示例代码 总结 前言 std::multimap 是 C++ STL 中的一个关联容器,用于存储键值对。与 std::map 不同,std::multimap 允许一个键关

md5值 作为mapstring,time_t键值

在后台 服务器处理客户端发过来的数据时,由于通信网络传输 较差,实际收到了客户端的数据并进行了处理,给出了回应,但客户端由于网络原因判断为该条消息未发送成功,而重发。则服务器程序必须做出去重。观察 实际解析到的消息结构体 如下 typedef struct{time_t m_c_time,string m_localid,string m_buddyid,string m_msg,}ms

spark之键值对RDD

1、键值对RDD生成方式 1.1、通过map函数来生成 通过map函数将x映射为(x,1) #在本地进行操作textFile = sc.textFile("file:///home/jsy/spark_test/test.txt")wordCount = textFile.flatMap(lambda line: line.split(" ")).map(lambda x:(x,1))

五大存储模型关系模型、键值存储、文档存储、列式存储、图形数据库

也可以认为是五大数据库存储模型。 数据库市场需要细分,行式数据库不再满足所有的需求,而有很多需求需要通过内存数据库和列式数据库解决,列式数据库在数据分析、海量存储、BI这三个领域有自己独到。 1. 关系型数据库(行式数据库) mysql sybase etc 定义:关系模型使用记录(行或者元祖)进行存储,记录存储在表中,表由架构界定。表中的每个列都有名称和类型,表中的所有记录都要

Redis_类比简单键值数据库

Redis核心技术与实战 - 01 目录 1、可以存储那些数据  Redis的value可以存储丰富的【数据类型】 2、可以对数据做什么操作  Redis提供了基本的增删改查等和基于复杂value类型操作接口 3、如何保存键值对(内存还是外存) Redis以内存为主保存键值对,但存在一旦掉电,数据就会全部消失问题,提供【Redis的持久化方式】。 4、键值对数据库基本架构  5、

使用redisTemplate删除当前redis库中所有键值

Set<String> keys = redisTemplate.keys("*");redisTemplate.delete(keys);