oracle数据库(DDL、表设计、创建表、序列、事务、DML)

DDL

一、设计表

前提:首先遵循三范式

1、确定表名

2、确定字段名  类型+约束(主键  外键  非空  默认  检查  唯一)

二、创建表

1、创建表(不加约束)

1)、创建表

--create table 表名(
--字段名 类型(长度) 约束,
--...其他字段....
--..约束........
--);

create table tb_user(
       userid number(5),
       username varchar2(30),
       userpwd varchar2(20),
       gender char(3)  
)

--加入注释
comment on table tb_user is '用户表';
comment on column tb_user.userid is '流水号,主键';
comment on column tb_user.username is '用户名';
comment on column tb_user.userpwd is '密码';
comment on column tb_user.gender is '性别';

2)、已有表中拷贝

--已有表中拷贝结构
--create table 表名 as select 字段列表 from 已有表 where 1!=1;  
create table copy_emp as select * from emp where 1!=1;  -- 只拷贝结构不拷贝数据
create table copy_emp2 as select empno,ename,sal from emp;  --结构和数据全部拷贝
select * from copy_emp;
select * from copy_emp2;

3)、删除表

--删除表
drop table copy_emp2;
--drop table 表名 cascade constraints

2、创建表(有约束)

1)、字段后直接给约束|字段后指定约束名字添加约束

create table tb_student(
       --学号  主键  唯一+非空
       --sid number(5) primary key,
       --sid number(5) constraints pk_student_sid primary key,
       sid number(5),
       --学生名字不能为空
       --sname varchar2(30) not null,
       sname varchar2(30)constraints sname_notnull not null,
       --年龄不能超过18~150
       sage number(3) check(sage between 18 and 150),
       --不是男就是女
       sgender char(3) check(sgender='男' or sgender = '女'),
       --唯一的
       sqq varchar2(30) unique
)

2)、在创建表结构的最后指定约束 & 表结构之后追加约束

--表结构最后定义约束
create table tb_student(
       --学号  主键  唯一+非空
       sid number(5),
       --学生名字不能为空
       sname varchar2(30),
       --年龄不能超过18~150
       sage number(3),
       --不是男就是女
       sgender char(3),
       --唯一的
       sqq varchar2(30),
       classid number(3),
       
       --定义约束  指定名字,指定约束 ,指定字段
       constraints pk_student_sid primary key(sid),
       constraints sname_notnull check(sname is not null),
       constraints ck_sage check(sage between 18 and 150),
       constraint fk_student_classid_classid foreign key(classid) references clazz(classid) on delete set null --on delete cascade 
)
--表结构后面追加约束
alter table tb_student add constraints student_sqq unique(sqq);

3)、删除(存在主外键关系)

一、删除约束
alter table tb_student drop constraints student_sqq;

二、删除数据

1、先删除从表中引用主表中当前这条数据的那些数据,然后再删除主表中的数据(默认)

2、直接删除主表中的数据,一起把从表中引用了当前要删除的主表中的数据的这些子记录删除

                ——on delete cascade 级联删除

3、在删除主表中数据的时候,从表中引用了这个数据的子记录设置为null

delete from clazz where classid=02 ;

三、删除主表

1、先删除从表,再删除主表

2、直接删除主表,级联删除主从表之间约束

drop table tb_txt_new cascade constraints;
drop table tb_user cascade constraints;

4)、数据截断

truncate

清除表中的全部数据

如果存在主从表关系,检查整个表结构是否有被引用,如果有结构上的引用就不能删除  不会开启事务

--删除约束(存在主外键关系,需删除外键约束)
alter table tb_student drop constraints fk_classid;

--截断数据
truncate table tb_student;
truncate table tb_class;

三、序列

数据库表中的主键值有的时候我们会用数字类型的,并且自增。Sequence 是oracle提供的用于产生一系列唯一数字的数据库对象。

mysql、sql server创建表的时候很容易实现。由于oracle中没有设置自增列的方法,所以我们在oracle数据库中主要用序列来实现主键自增的功能。

使用工具|程序管理流水号,序列在创建时 没有与表关联 ,在操作数据时 与表关联

1、创建

--create sequence 序列名 start with 起始值 increment by 步进;
create sequence seq_classid start with 100 increment by 2;

2、使用

操作数据 添加 更新 -->主键
--1)、currval :当前值
--2)、nextval:下个值
select seq_classid.nextval from dual;
select seq_classid.currval from dual;
insert into clazz values(seq_classid.nextval,'27期','java');

oracle数据库(DDL、表设计、创建表、序列、事务、DML)_第1张图片

3、删除

drop sequence 序列名

四、事务

事务是指作为单个逻辑工作单元执行的一组相关操作。这些操作要求全部完成或者全部不完成。使用事务是为了保证数据的安全有效。

事务有一下四个特点:(ACID)
1、原子性(Atomic):事务中所有数据的修改,要么全部执行,要么全部不执行。
2、一致性(Consistence):事务完成时,要使所有的数据都保持一致的状态,换言之:通过事务进行的所有数据修改,必须在所有相关的表中得到反映。
3、隔离性(Isolation):事务应该在另一个事务对数据的修改前或者修改后进行访问。
4、持久性(Durability):保证事务对数据库的修改是持久有效的,即使发生系统故障,也不应该丢失。

Oracle 默认的隔离级别是 read committed。(读已提交)

1、事务的开启
自动开启于 DML 之 insert delete update
2、事务的结束
1) 成功
正常执行完成的 DDL 语句:create、alter、drop
正常执行完 DCL 语句 GRANT、REVOKE
正常退出的 SQLPlus 或者 SQL Developer 等客户端
如果人工要使用隐式事务,SET AUTOCOMMIT ON (只针对一个连接)
手动提交 :使用 commit
2) 失败
rollback ,手动回滚
非法退出 意外的断电

注意:rollback 只能对未提交的数据撤销,已经 Commit 的数据是无法撤销的,因为 commit之后已经持久化到数据库中。

DML

1、insert

--insert into 表名 values(和表结构顺序和个数和类型一致的数据,可以手写也可以从别的表中获取的);
insert into  tb_student values(4,'hah',18,'男',21324324,null);                    

insert into tb_student(sid,sname) values(seq_classid.nextval,(select ename from emp where sal=800));              

--insert into 表名 select 查询列 from 源表 where 过滤数据;
insert into copy_emp select * from emp;
select * from copy_emp;

2、update

--update 表名 set 字段=值 [,....] where 过滤行记录;
update clazz set subject='大数据';                       
update clazz set subject='py' where classid=106; 

3、delete

-delete [from] 表名 where 过滤行记录
delete from clazz;
delete tb_student where sid=3;

 

 

 

你可能感兴趣的:(数据库)