oracle建表相关 包括主键索引和外键约束

本文对比了Oracle与MySQL在建表语句上的差异,重点解析了聚集索引和级联操作的不同实现方式,指出Oracle默认创建索引及不支持级联更新的特点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天来聊一下oracle的建表语句,比如下面的

create table BBB_INFO 
(
   BBB_ID			number(8)                      not null,
   AAA        		VARCHAR2(8)                    null,
   BBB           	VARCHAR2(8)                    null,
   CCC           	VARCHAR2(8)                    null,
   DDD    	 		VARCHAR2(8)                    null,
   constraint PK_BBB_INFO primary key (BBB_ID)
);
create table AAA_INFO 
(
   AAA_ID    		NUMBER(8)                    not null,
   BBB_ID          	NUMBER(8)                    null,
   FFF        		NUMBER(12)                   null,
   HHH         		VARCHAR2(8)                  null,
   constraint AAA_INFO primary key (AAA_ID)
);

alter table AAA_INFO 
   add constraint FK_AAA__REFERENCE_BBB_ foreign key (BBB_ID)
      references BBB_INFO (BBB_ID);

很明显
BBB_INFO 表有一个主键BBB_ID,AAA_INFO有一个主键AAA_ID,然后BBB_ID是AAA_INFO的外键,这很简单,入门sql就该会的。
但是今天建表的时候,设计给的是mysql的建表语句,加了很多不必要的属性
其一:

他给的建表语句中的constraint PK_BBB_INFO primary key (BBB_ID)这一句 原来是这样的constraint PK_BBB_INFO primary key clustered (BBB_ID),加了一个clustered这个属性,根据百度clustered是聚集索引,但是我发现在oracle中不加这个单词,也会默认创建一个索引,这个索引的意思,参看https://blog.youkuaiyun.com/x1n1010/article/details/12882933

原文:
因为新增一条数据时,oracle先去数据库查询此条新增数据是否存在,如果不存在则插入成功,否则插入失败。试想下如oracle不自动创建索引,查该新增数据是否存在于数据库就得整张表去扫描(千万级数据表全表扫描是不可想象的),数据量大时影响性能是肯定的。那么主键、唯一约束在新增数据时oracle都会先去数据库查询,用到查询就要用到索引提高性能,所以他就会默认创建索索引来提高检查数据是否存在来,从而提高查询效率。这就是oracle自动创建索引的初衷。

结论:如果在plsql中,删掉这个属性就可以了。(有问题可以指正哈,我也是目前这么觉得)

其二:
外键约束这里,他给的是加了级联更新和级联删除的。

alter table AAA_INFO
   add constraint FK_AAA__REFERENCE_BBB_ foreign key (BBB_ID)
      references BBB_INFO (BBB_ID)
      on update restrict
      on delete restrict;

嗯,就是后面两句。经过搜索restrict是mysql的约束,oracle中相同的是No Action。而且oracle中没有更新的级联的,只有删除的,而且这个删除的级联是在你创建外键的时候,就自己加上了的。

结论:如果在plsql中,删掉后面这两句就可以了。(有问题可以指正哈,我也是目前这么觉得)

马克一下,免得自己下一次忘记。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值