今天来聊一下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中,删掉后面这两句就可以了。(有问题可以指正哈,我也是目前这么觉得)
马克一下,免得自己下一次忘记。