SQL在项目中的使用规范

一、数据库设计规范

1.【强制】数据库名需要表示其实际含义的英文单词或缩写(通常是应用系统的英文缩写),不超过10位,并以DB结尾

2.【强制】表空间名需要包含数据表空间(_data)和索引表空间(_idx),创建应用用户需指定默认的表空间为数据表空间

        在Oracle数据库中,数据库和表空间是两个重要的概念,它们之间存在着密切的关系。

        1. 数据库(Database): 数据库是逻辑上的一个概念,它包含了用户创建的所有对象,例如表、视图、索引、存储过程等。数据库是由数据字典、系统表空间和用户表空间组成的集合体,是Oracle中最高级别的逻辑存储结构。
        2. 表空间(Tablespace): 表空间是物理上的一个概念,它是数据库中用来存储实际数据的地方。每个表空间由一个或多个数据文件组成,这些数据文件可以分布在不同的磁盘上。表空间定义了存储结构的逻辑结构,控制了数据库中数据的存储和管理。

        关系: 数据库和表空间之间的关系是一对多的关系。在一个数据库中可以包含多个表空间,而一个表空间只能属于一个数据库。通过创建不同的表空间,可以将数据库中的数据逻辑上划分为不同的存储单元,从而更好地管理数据库的存储结构和性能。

        总的来说,数据库是逻辑上的容器,包含了用户创建的所有对象,而表空间是物理上的存储空间,用于存储数据库中的数据。数据库和表空间之间的关系有助于对数据库进行组织、管理和优化

        在创建数据库时,通常的步骤是先创建数据库,然后创建表空间,最后创建用户并指定表空间。

        1. 创建数据库:首先,你需要创建一个数据库实例,这通常是通过在数据库管理系统中执行相应的命令或使用管理工具来完成的。数据库创建后,系统会分配一些默认的系统表空间和临时表空间。
        2. 创建表空间:接下来,你可以创建自定义的表空间,用于存储用户数据和索引。表空间是数据库中用于组织和管理物理存储的结构,它可以指定数据文件的位置、大小等参数。
        3. 创建用户并指定表空间:最后,你可以创建数据库用户,并在创建用户时指定其默认表空间。这样,用户在创建表和索引时将会使用指定的表空间来存储数据。

        总的来说,先创建数据库,然后创建表空间,最后创建用户并指定表空间是一种常见的数据库管理流程。这样的顺序有助于规划和管理数据库的存储结构,使得数据库的组织更加清晰和灵活。

 

首先创建oracle的数据和实例:具体操作资料如下

oracle数据库的创建

Oracle 19c创建数据库

然后创建表空间和用户,最后才是创建表  

oracle 数据库创建表空间、用户、数据库实例、授权、数据导入

Oracle创建数据库、表空间、用户和新建表操作

3.【原则】若应用系统属于同一个业务领域,原则上在一个数据库Instance(实例)下创建多schema(模式);若不属于同一个业务领域,则创建多个Instance。Oracle19C之后,使用多租户方案。

二、命名规范

1.[强制]在表名(对象名)创建中,不能和保留字、关键字、常用访问访问方法冲突

对于Oracle保留关键字,可以通过v$reserved_words视图查询

SELECT keyword
FROM v$reserved_words
ORDER BY keyword; 

表名的命名逻辑:项目名+模块名+表名

2.[强制]临时表以”tmp”为前缀并以日期为后缀,tmp表名_日期

create temporary table 
    tmp_user_info_20220505 (col1 varchar(20)) 
on commit delete rows; 

        该语句是在数据库中创建一个临时表(Temporary Table),且在事务提交时删除表中的所有行。具体含义如下:

create temporary table: 创建一个临时表,临时表是一个在当前会话中存在,并且在会话结束或事务提交时自动删除的表。

tmp_user_info_20220505: 表名为 tmp_user_info_20220505。

(col1 varchar(20)): 括号内列出了表中的列,这里定义了一个名为 col1 的列,数据类型为 varchar,长度为 20。

on commit delete rows: 表示在事务提交时删除表中的所有行。也就是说,当当前事务提交后,临时表中的数据将被自动清空。

这种临时表通常用于存储临时性数据,例如某些复杂查询的中间结果,或者需要在特定操作过程中暂存数据的情况。这样的临时表不会干扰到其他会话或进程,也不会长期存储数据,因为它们会在会话结束或事务提交时被自动删除。

 

3.[强制]备份表以”bak”为前缀并以日期为后缀,bak表名_日期

create table bak_USER_20220505 
as select * from USER; 

该语句的含义是创建一个名为 bak_USER_20220505 的表,该表与现有的 USER 表具有相同的结构(列名和数据类型),并且将 USER 表中的所有数据复制到新创建的表中。

具体步骤如下:

create table bak_USER_20220505: 创建名为 bak_USER_20220505 的表。

as select * from USER: 从现有的 USER 表中选择所有的行和列。* 表示选择所有列。

通过这个语句,您可以创建一个新的表 bak_USER_20220505,它拥有与 USER 表相同的结构,并将 USER 表中的数据复制到新表中。这样,在进行某些操作时,您可以在新的表上进行实验和修改,而不会影响原始的 USER 表。

 

4.[强制]主键和唯一约束

主键使用pk作为前缀,pk_表名pk_user_info; 唯一约束使用uk作为前缀,序号作为后缀,uk表名序号:uk_user_info_01

        表的主键默认为唯一键。主键(Primary Key)是用来唯一标识表中每一行数据的字段或字段组合,在表中具有唯一性约束,因此可以确保表中的每一行都具有唯一的主键值。

        在定义主键时,默认会对其施加唯一性约束,因此主键自然而然地也成为了唯一键。这意味着,主键的值不能重复,且不能为空。由于主键在数据库表中的重要性,它具有唯一性和非空性的特性。

        需要注意的是,虽然主键默认为唯一键,但唯一键不一定是主键。您可以单独创建一个唯一键约束,来保证某个字段或字段组合的唯一性,而不将其定义为主键。

总之,主键默认为唯一键,但唯一键并不一定是主键
---------------------------------------------------------------------------------------
        Oracle数据库的唯一约束(Unique Constraint)是用来确保表中的某列或多列的数值是唯一的。

        常见的命名约定包括使用 "UK_表名_列名" 或者 "UK_表名_序号" 的形式,其中 "UK" 表示 Unique Key 的缩写,后面接着表名和列名或者序号作为标识

 

5.[强制]唯一索引和普通索引

唯一索引的英文全称是 "unique index",

而普通索引的英文全称是 "non-unique index" 或者 "index"

唯一索引使用unq前缀,序号作为后缀,unq表名序号:unq_user_info_01

普通索引使用idx前缀,序号作为后缀,idx表名序号:idx_user_info_01

6.[强制]序列命名

序列命名使用seq作为前缀,名称应能表达用途或含义:seq_user_id

7.【强制】字段命名需要表示其实际含义的英文单词或缩写,避免与表名重名;各表之间相同意义的字段应同名。

create table user_info 
    (name varchar2(20),id number); 

三、表设计规范

1.【强制】CREATE TABLE/INDEX需指定对应的应用数据表空间或索引表空间

create table user_info (name varchar2(20),id number) tablespace user_data;
create index idx_user_info_01 on user_info(name,id) tablespace  user_idx 

2.【强制】禁止使用外键,容易产生死锁,应由程序保证参照完整性

1、数据结构的外键约束,一般来说在开发系统的过程中,外键约束遇到的问题较少,但是在移植程序,升级程序的过程中,外键约束对程序的困扰尤其严重,如果子表A中的一个字段同主表B的字段有外键关系,如果B表没有添加对应的数据,那么在操作A表的过程中就容易出现外键约束错误提示 2、外键上无索引可能导致数据字表、主表DML出现锁表

3.【强制】表和表列上必须要有注释

create table USER
(
  ID   NUMBER(20) not null,
  constraint PK_USER primary key (ID)     //主键
);

//添加注释
comment on table USER is '人员信息表';
comment on column USER.ID is '人员ID';

        这段代码是用来创建一个表的结构以及定义该表的主键约束。

        ID NUMBER(20) not null : 这一部分定义了表中的一个名为ID的列,其数据类型为NUMBER(20),并且设置为非空(not null)。在数据库中,这个字段将用来存储数值型数据,长度为20个数字。

        constraint PK_USER primary key (ID) : 这一部分定义了一个名为PK_USER的主键约束,它指定了ID列作为主键。主键是一种用来唯一标识表中每一行数据的字段,同时主键字段的值不能重复,也不允许为空。在这个例子中,ID列被指定为主键,确保了每条记录的唯一性和完整性。

        综合起来,这段代码定义了一个包含ID列的表结构,并且指定了ID列作为主键,确保了该表中ID字段的数值唯一性,且不为空。

4.【强制】表字段数目禁止超过 100 个,超过建议拆分成多个表

        表结构如果太过复杂,会引起业务上处理复杂,同时也可能会引起并发问题。如果根据业务特性拆分成多个表,可以避免高并发下的锁表现象

5.【强制】表记录长度不超过8k,避免产生行链接

        当一行记录初始插入的时候事可以存储在一个block中的,由于更新操作导致行长增加了,而block的自由空间已经完全满了,这个时候就产生了行迁移。在这种情况下,Oracle将会迁移整行数据到一个新的block中

(假设一个block中可以存储下整行数据),Oracle会保留被迁移行的原始指针指向新的存放行数据的block这就意味着被迁移行的ROW ID是不会改变的。 当发生了行迁移或者行链接,对这行数据操作的性能就会降低,因为Oracle必须要扫描更多的block来获得这行的信息。这时会导致Oracle数据库的性能低下。)

6.【强制】日志表、流水表必须使用分区表

        日志表、流水表数据量太大,几天的时间可能就会产生几百万、几千万的数据,如果查询的话会导致数据库的性能问题。

7.【强制】若单表记录数超过2000万必须使用分区表

        数据库在处理大表时,性能就开始明显降低,所以建议 单表物理大小限制在16GB,表中数据控制在2000W内。如果数据量或数据增长在前期规划时就较大,那么在设计评审时就应加入分表策略。

8.【强制】对于按固定周期定期切换分区的分区表,建议提前完成分区创建,避免数据库自动切换分区时对数据库产生性能影响

        对于按固定周期定期切换分区的分区表,建议提前完成分区创建,避免数据库自动切换分区时对数据库产生性能影响。

        自动分区,number 或者 date类型。年底例行检查。

四、字段设计规范

1.【强制】表字段类型不允许使用LONG、RAW、LOG RAW、LOB、CLOB、BLOB、BFILE类型以及复杂数据类型( 数组,自定义等), MYSQL禁止使用 text,bit 等字段类型

        不在数据库中存储图片,文件等大的二进制数据,只存储文件地址信息,大字段会导致查询性能问题

2.【建议】索引字段建议为 not null default ‘xxx’,,避免is null 或 nvl(xxx,sysdate)操作等

        当条件是is null 和is not null时,执行计划并不会走索引而是全表扫描

 例如:
select * from a where b is null;
修改:
select * from a where b = '1';

 

3.【强制】表上用来做关联的字段,必须使用相同的数据类型

        多表关联时,如果关联字段字段类型不一致,将发生隐式转换,转换规则如下: ​

        字符类型(char/varchar2)和数字(number)关联,字符类型需要隐式转换成数字类型 ​

        字符类型(char/varchar2)和时间(date/timestamp)关联,字符类型需要隐式转换成时间类型 ​

        普通字符类型(char/varchar2)和国家字符字符串(nchar/nvarchar2)关联,普通字符类型转换成国家字符集字符串 ​

        普通时间类型(date)和时间戳类型(timestamp)关联,普通时间类型需要转换成时间戳类型 ​

        关联字段的隐式转换主要隐患在于当两个表关联时,假如是被驱动表的关联字段发生隐式转换,将导致被驱动表上的关联列的索引不可用,从而使得本该高效的NESTED LOOP连接变得低效或者变成HASH JOIN

五、索引设计规范

1.【强制】每张表索引不超过4个,经常有大批量插入、更新操作表,应尽量少建索引

        索引在数据库中是以表的形式存储的,太多的索引一定是增加开销的。 ​ 索引在数据库中是以表的形式存储的,频繁更新(插入)的的字段不要建立索引,因为在字段中做更新(插入)操作后,索引也会更新的,这样的话效率会大大降低

2.【强制】复合索引字段禁止超过4个,将选择性高或等值谓词条件字段放在前面,选择性差或者非等值谓词条件字段放在后面

        索引的作用,是将表中某一列或几列按照指定的顺序存取到相应的索引树中,便于在查询访问时通过索引树结构快速的获取到相应索引键值。主要的目的还是在于高效的访问数据。

        索引的体积: 随着索引列宽度、索引的列数量、索引的碎片化等多方面的不同,索引的体积还会有相应的差异。 针对某一列而言,单列索引体积/叶子块数量一般情况下都会小于复合索引。 NUMBER类型列的索引一般都比字符型列的索引要小。 并且索引体积也会受到索引碎片化程度的影响。

        索引的选择性: ​ 单个索引选择行主要取决于索引列的唯一值数量及数据分布情况等。 ​ 复合索引的多列查询取决于多个索引列的唯一值数量等因素。但如果复合索引只使用了其中的部分列或某一列时,除了受到使用列的数据分布情况之外,还受到索引的前导列或前面未使用部分的索引列的唯一值数量的影响。

        索引影响DML成本: ​ 建立索引能帮助提升小范围查询的查询效率,但是索引是在表中增加了树状维护结构的,因此对表做DML时,数据库也会额外的增加维护索引的成本。因此表中建立哪些索引,索引及索引列的数量多少还是要经过评估的。

3.【强制】禁止创建重复索引(如a和a,b列都建了索引)

        创建索引通常是我们提高数据访问效率的方法,如果在条件列上创建索引、在关联列上创建索引。而随着表的使用越来越频繁,条件的组合越来越多,那么索引的数量通常也会随之升高。索引的数量增加不仅会导致大量空间的使用,还会增加表上索引的维护成本,使DML操作语句效率降低。为达到表的访问与维护成本两者之间的平衡,索引是否高效就显得非常重要了。而该规则会对表上的索引进行分析,把理论上索引效果可以被替代的冗余索引审核出来,并进一步处理。

create index IDX_T1_OWOBOT on T1(OWNER,OBJECT_NAME,OBJECT_TYPE);
create index IDX_T1_OWOB on T1(OWNER,OBJECT_NAME);

drop index IDX_T1_OWOB on T1(OWNER,OBJECT_NAME);

六、SQL语句规范

1.【强制】禁止update、delete,select不加where条件

        避免全表扫描导致的数据库性能问题以及可能导致的业务误删除

update user set sex = 'male';
delete user;
select name from user;
修改建议为
update user set sex = 'male' where id = 12;
delete user where id = 12;
select name from user where id=12; 

2.【强制】禁止表联结缺少联结条件

        在数据库中多表关联笛卡尔积将会导致结果集呈几何倍数增大,很容易造成大量cpu等资源消耗和SQL本身性能下降,例如:A、B两张表分别有1w条数据和2w条数,a表和b表做笛卡尔积返回的数据将达到1w*2w条=2亿条,所以即使是数据量较小的表做笛卡尔连结也可能造成性能问题

 select count(1)
from OTOSHOP.TL_EBS_SHOP_ALLOT_LOG,
OTOSHOP.ECPS_ORDER,
OTOSHOP.O2O_WAREHOUSE
where 1 = 1;
该SQL为开发人员忘记添加关联条件导致笛卡尔积,该SQL执行过程中导致主机cpu使用率达到90%以上。通过查看表数据量,理论上该SQL表关联数据量将达到10的16次方数量级

3.【强制】where条件里的过滤字段上禁止使用函数或者计算操作,尤其是索引字段

        当查询列上有索引时,如果优化器认为通过索引查询效率更高,会选择使用索引。

        当在查询列上有表达式或函数时,因为无法通过给定的参数快速定位数据,而使语句无法利用已建好的索引。

        常见情况是对日期列的处理,为了书些方便或语句直观,很多人会在日期列上增加函数,从而引起无法通过索加加速

select * from t where to_number(a)=100;
select * from t where a+0=100;

比较建议:
select * from t where a =100;

 

4.【强制】Like禁止使用%前缀进行模糊前缀查询

        索引中的数据是有序的,我们只有按这个顺序去快速定位数据才可以有效的利用索引。而左模糊查询( like '%xxx')因左侧数据的不确定性,使查询无法快速的定位数据,只能把所有数据都扫描完才可以确认是否匹配,使得查询无法通过预设的普通索引快速返回数据,所以无法利用预设的普通索引。

        不建议在查询语句中使用左模糊模查询:

select * from t_dba_objects where object_name like '%EM';

建议使用方法:
select * from t_dba_objects where object_name like 'EM%';

select * from t_dba_objects where object_name = 'EM';

5.【强制】禁止在高并发场景下使用悲观锁写法:select … for update

使用悲观锁对数据加锁之后,如果数据处理过程中有其他人想要获得该数据的锁,就会被阻塞,需要该事务完成后才可以继续进行。

如果锁定范围太多甚至是全表加锁,则可能阻塞事务过多,从而引起性能问题。

如果两个持锁的会话(session)互相获取对方的锁,则会发生死锁(deadlock)现象

select * from emp where empno = 7788 for update;
上方写法不建议,应该使用下方写法:
select * from emp where empno = 7788; 

6.【强制】不应使用select *来一次取出表的所有字段

错误写法:
select * from user_info;
建议使用
select name from user_info where xxx;
或者
select
   <include refid="Base_Column_List" />
from
   BOYANZSC_TORACLEDEMO_USER
where
   IDCARD = #{idCard}
   
当要取出表的条数总和的时候:  这里也不要是count(*) 而是count(1)
select
	count(1)
from
	BOYANZSC_TORACLEDEMO_USER
<where>

	<if test="PagePO.userName != null and PagePO.userName != ''">
		USER_NAME like '%' || #{PagePO.userName} || '%'
	</if>
	<if test="PagePO.sex != null and PagePO.sex != ''">
		and SEX = #{PagePO.sex}
	</if>
	<if test="PagePO.age != null and PagePO.age != ''">
		and AGE = #{PagePO.age}
	</if>
	and DEL_STATUS = 0
</where>
    对于子表batch 如果时间够,也不要用select*
    
    <insert id="batchInsertUser" parameterType="java.util.List" useGeneratedKeys="false">
        INSERT INTO BOYANZSC_TORACLEDEMO_USER (
            PK_USER,
            USER_NAME,
            AGE,
            SEX,
            IDCARD,
            PHONENUM,
            EMAIL,
            CREATE_USER,
            CREATE_TIME,
            UPDATE_USER,
            UPDATE_TIME,
            DEL_STATUS,
            ADDRESS_ID
            )
            SELECT
                   SEQ_USERID.nextval,
                   batch.USERNAME,
                   batch.AGE,
                   batch.SEX,
                   batch.IDCARD,
                   batch.PHONENUM,
                   batch.EMAIL,
                   batch.CREATEUSER,
                   batch.CREATETIME,
                   batch.UPDETEUSER,
                   batch.UPDATETIME,
                   batch.DELSTATUS,
                   batch.ADDRESSID
            FROM(
                <foreach collection="toracleDemoUserPOList" item="item" separator="union all">
                    SELECT
                        #{item.userName} as USERNAME,
                        #{item.age} as AGE,
                        #{item.sex} as SEX,
                        #{item.idCard} as IDCARD,
                        #{item.phoneNum} as PHONENUM,
                        #{item.email} as EMAIL,
                        #{item.createUser} as CREATEUSER,
                        #{item.createTime} as CREATETIME,
                        #{item.updateUser} as UPDETEUSER,
                        #{item.updateTime} as UPDATETIME,
                        #{item.delStatus} as DELSTATUS,
                        #{item.userAddressId} as ADDRESSID
                    FROM
                        dual
                </foreach>
                )batch
    </insert>

 

7.【强制】业务SQL语句的where子句中的变量,都应使用绑定变量来实现

select * from user_info where id = '1';
应该修改为:
select * from user_info where id = 'a';
a为绑定变量 

8.【强制】及时对表和索引进行统计信息更新

应用程序对表数据进行大量增、删操作后,要及时对表进行统计信息更新,变换量超过10%以上时,必须及时对表和索引字段进行统计更新。

七、csdn资料sql命名规范

1.1 数据库和SID

数据库名定义为系统名+T_+模块名+表义名

  ★ 全局数据库名和例程SID 名要求一致

  ★ 因SID 名只能包含字符和数字,所以全局数据库名和SID 名中不能含有“_”等字符

2.1表相关

1表空间

  ★ 面向用户的专用数据表空间以用户名+_+data命名 ,如Aud 用户专用数据表空间可命名为Aud_data

  ★ 面向用户的专用索引表空间以用户名+_+idx命名

  ★ 面向用户的专用临时表空间以用户名+_+tmp命名

  ★ 面向用户的专用回滚段表空间以用户名+_+rbs 命名

  ★ 面向应用的表空间以应用名+data/应用名+idx/应用名+tmp/应用名+rbs 命名

  ★ LOB 段数据专用表空间以其数据表空间+_+lobs 命名,如上例中数据表空间为Aud_data,则LOB 段表空间可命名为Aud_data_lobs

2 表空间文件

  表空间文件命名以表空间名+两位数序号(序号从01开始)组成,如Aud_data01 等

3 表

  表命名要遵循以下原则:

  ★ 一般表采用“系统名+t+模块名++表义名” 格式构成

  ★ 若数据库中只含有单个模块,命名可采用“系统名+t_+表义名”格式构成

  ★ 模块名或表义名均以其汉语拼音的首字符命名,表义名中汉语拼音均采用小写,且字符间不加分割符;

  ★ 表别名命名规则:取表义名的前3 个字符加最后一个字符。如果存在冲突,适当增加字符(如取表义名的前4 个字符加最后一个字符等)

  ★ 临时表采用“系统名+t_tmp_+表义名” 格式构成

  ★ 表的命名如

  dft_gy_cbap:系统名(电费 df)+t+模块名(高压 gy)++表义名(抄表安排 cbap)

  dft_cbbj: 系统名(电费 df)+t_+表义名(抄表标记 cbbj)

  dft_tmp_hj: 系统名(电费 df)+tmp+表义名(合计hj)(此处为临时表)

  ★ 关联表命名为Re表A表B,Re 是Relative的缩写,表A 和表B均采用其表义名或缩写形式。

4 属性(列或字段)

  属性命名遵循以下原则:

  ★ 采用有意义的列名,为实际含义的汉语拼音的首字符,且字符间不加任何分割符

  ★ 属性名前不要加表名等作为前缀

  ★ 属性后不加任何类型标识作为后缀

  ★ 不要使用“ID”作为列名

  ★ 关联字段命名以 “cd++关联表的表义名(或缩写)++字段名”进行

5 主键

  ★ 任何表都必须定义主键

  ★ 表主键命名为:“pk++表名(或缩写)++主键标识”如“PK_Customer_CustomerID”等

6 外键

  表外键命名为: “fk++表名(或缩写)+主表名(或缩写)+_+主键标识”如“fk_YHLX_YHXX_SFZH”等

7 CHECK约束

  CHECK 约束命名为: “chk+_+CHECK约束的列名(或缩写)”

8 UNIQUE约束

  UNIQUE 约束命名为: “unq+_+UNIQUE约束的列名(或缩写)”

唯一约束使用uk作为前缀,序号作为后缀,uk表名序号:uk_user_info_01

常见的命名约定包括使用 "UK表名列名" 或者 "UK表名序号" 的形式,其中 "UK" 表示 Unique Key 的缩写,后面接着表名和列名或者序号作为标识

请记得主键是pk_为前缀,主键是默认唯一约束的,而且其他字段也可以设置唯一约束。

9 索引

  普通索引(Normal)的命名为:“表名(或缩写)++列名+idx”。其中多单词组成的属性列列名取前几个单词首字符再加末单词首字符组成如yd_kh 表khid 上的index: yd_kh_khid_idx

唯一索引(Unique)使用unq前缀,序号作为后缀,unq表名序号:unq_user_info_01

10 触发器

  ★ AFTER型触发器

  系统名+tr+<表名>+ +[_row]

  ★ BEFORE型触发器

  系统名+tr+<表名>+bef+[row]

  ★ INSTEAD OF型触发器

  系统名+ti+<表名>+++[_row]

  ★ 各种类型的触发器中

  i,u,d 分别表示insert、update 和delete行级触发器,后加_row 标识,语句级触发器不加,如 yddftr_CSH_i_row

11 簇

  簇以簇中要存储的各个表(或表别名)及表间加and的组成 命名,即表“A+And+表B…”,如存储GR(工人)和GRJN(工人技能)表的簇命名为GRAndGRJN

这里面

八、创建表空间,和用户的sql留存:

1、创建表空间stu_data,100m,自动扩展表空间

 create tablespace stu_data 
datafile 'D:\oracle\oradata\STUDENT\stu_data.dbf' size 100m
AUTOEXTEND on next 2m 
logging

一个用于在Oracle数据库中创建表空间(tablespace)的SQL语句。表空间是数据库中存储数据和索引的逻辑结构,它将物理存储与逻辑数据库对象分开。

让我逐步解释这个SQL语句:

create tablespace stu_data: 这部分指定了要创建的表空间的名称为"stu_data"。
datafile 'D:\oracle\oradata\STUDENT\stu_data.dbf' size 100m: 这一部分指定了表空间存储数据的物理文件路径以及文件名,以及初始大小为100兆字节(M)。这里使用的文件扩展名".dbf"代表Oracle的数据文件。
AUTOEXTEND on next 2m: 这表示在表空间达到容量上限时,自动扩展表空间的功能已经启用,并且每次自动扩展的增量为2兆字节(M)。
logging: 这表示对这个表空间执行的操作需要进行日志记录,这有助于数据库的恢复和一致性。
总的来说,这条SQL语句创建了一个名为"stu_data"的表空间,它使用了一个初始大小为100兆字节的数据文件,并配置了自动扩展和日志记录功能。

 

2、查看表空间

select tablespace_name,contents from dba_tablespaces 

3、创建用户studba,口令:student2020,指定默认表空间stu_data,临时表空间temp,具有创建表,创建视图,创建序列,创建对话,对表空间大小不加限制权限,和授予用户最典型、开发人员和系统管理角色

create user studba IDENTIFIED BY studba2020 
default TABLESPACE stu_data
TEMPORARY TABLESPACE temp; 

GRANT create table,create view,create sequence,create session,
unlimited tablespace TO studba;
GRANT connect TO studba;
GRANT resource TO studba;
GRANT dba TO studba;

这段代码是针对数据库用户的创建和授权操作。让我来解释一下:

CREATE USER studba IDENTIFIED BY studba2020:这条语句用于创建一个名为"studba"的用户,并设置密码为"studba2020"。

DEFAULT TABLESPACE stu_data:这表示当用户在创建表时没有指定表空间时,将使用"stu_data"作为默认的表空间。

TEMPORARY TABLESPACE temp:这表示用户在执行需要临时表空间的操作时将使用"temp"作为临时表空间。

接下来的几条语句是授权操作:

GRANT create table,create view,create sequence,create session, unlimited tablespace TO studba:这些语句授予了用户"studba"创建表、视图、序列、会话以及无限表空间的权限。
GRANT connect TO studba:这条语句授予了用户"studba"连接数据库的权限。
GRANT resource TO studba:这条语句授予了用户"studba"一组预定义的数据库资源权限,包括创建表、程序单元等权限。
GRANT dba TO studba:这条语句授予了用户"studba"数据库管理员权限,即最高权限,可以对数据库进行任何操作。


综合起来,这段代码实际上是在数据库中创建了一个名为"studba"的用户,并为该用户分配了多项权限,使其能够在数据库中进行各种操作。

4、使用studba用户创建用户表(包括主键、外键),存放在stu_data表空间

drop table usertab purge;


create table usertab 
(utid number(6) generated by default as identity(start with 1 increment by 1),
uname varchar2(20) not null,
upwd varchar2(50) not null,
uright char(1) default '2',
constraint pk_ytid primary key(utid))TABLESPACE stu_data
storage(initial 256k)  --数据区初始大小为256K
PCTFREE 5 --空闲空间的比例为5%
pctused 60 --表示该数据块中有60%的空间可用于插入新数据
initrans 10;  --设置当前表使用用户的并发数量 

查看表名

select table_name,tablespace_name from user_tables 

5、使用studba用户创建其他数据表(包括主键,外键),存放在stu_data表空间;
dorp table student_tab purge;

create table student_tab
(xh varchar2(11) not null primary key,
xm char(8) not null,
xb char(4) default'男',
cssj date not null,
zy char(12),
zxf number(2) default 0,
bz varchar2(200))
tablespace stu_data
storage(initial 256k)
pctfree 5
pctused 60
initrans 10;
6、插入数据,每张表10条数据以上

insert into usertab(Uname,Upwd.Uright) values('a','122343','2');
insert into usertab(Uname,Upwd,Uright) values('b','12ed44','2');
insert into usertab(Uname,Upwd,Uright) values('c','3278js','2');
insert into usertab(Uname,Upwd,Uright) values('d','123456','1');
insert into usertab(Uname,Upwd,Uright) values('e','shwujwe','2');
insert into usertab(Uname,Upwd,Uright) values('f','3isjss','1');
insert into usertab(Uname,Upwd,Uright) values('g','123456','2');
insert into usertab(Uname,Upwd,Uright) values('h','hwu291i','1');
insert into usertab(Uname,Upwd,Uright) values('i','123456','2');
insert into usertab(Uname,Upwd,Uright) values('j','773628','2');
insert into usertab(Uname,Upwd,Uright) values('k','123456','2');
insert into usertab(Uname,Upwd,Uright) values('l','123456','1');

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值