DDL&DML

作者: 某某宝 | 来源:发表于2019-05-20 08:40 被阅读0次

    一、表设计(DDL)
    1、设计表:
    遵循三范式
    确定表名
    确定字段名 类型+约束(主键、外键、非空、默认、检查自定义规则、唯一)
    注:主键: 唯一标识一条记录(唯一且非空)
    唯一: 唯一
    非空: 不能为空
    默认: 当没给值是设定默认值
    外键: 参考其他表(自己)的某个(些)字段
    检查: 自定义规则
    2、创建表

    • 创建新表(不加约束)
    --创建表
    --create table 表名(
    --字段名 类型(长度) 
    --...其他字段....
    --);
    create table t_user (
           --序号
           ssid number(5) ,
           --姓名
           ssname varchar2(30),
           --密码
           spwd varchar2(10),
           --性别
           gender char(3)
    );
    

    2、创建表

    • 创建表(同时创建约束+默认名称)字段后直接给约束
      简单,但是后期不方便排错
    --表+约束 字段后直接给约束 
    --创建学生表
    create table s_student(
           --学号 主键 唯一非空
           sid number(8) primary key,
           --学生名字不能为空
           sname varchar2(20) not null,
           --年龄不超出范围【18,48】
           sage number(3) check(sage between 18 and 48),
           --男或女
           sgender varchar2(3) check(sgender in('男','女')),
           --邮箱
           mail varchar2(30) unique      
    )
    --注意为小括号,中间用逗号隔开,最后一个不用逗号
    
    • 创建表(同时创建约束+指定名称) 在字段后指定约束名字添加约束,如:
      后期方便排错,推荐使用
    --学号 主键 唯一非空
    sid number(8) constraints pk_sid primary key,
    --学生名字不能为空
    sname varchar2(20) constraints sname_notnull not null,
    
    • 创建表(同时创建约束+指定名称) 在结构的最后指定约束
      推荐, 便于后期排错
    --表结构最后定义约束
    --创建班级表
    create table classes(
           classid number(3) primary key,
           cname varchar2(5) not null
    )
    --创建学生表
    create table s_student(
           --学号 主键 唯一非空
           sid number(8) ,
           --学生名字不能为空
           sname varchar2(20) ,
           --年龄不超出范围【18,48】
           sage number(3) check(sage between 18 and 48),
           --男或女
           sgender varchar2(3) check(sgender in('男','女')),
           --邮箱 
           mail varchar2(30),
           --班级
           classid number(3),
           --定义约束  指定名字,指定约束 ,指定字段
           constraints pk_sid primary key(sid),
           constraints sname_notnull check(sname is not null),
           --外键约束
           constraints fk_classid foreign key(classid) references classes(classid) on delete set null      
    )
    
    • 创建表(追加创建约束+指定名称) 表结构之后追加约束
    --表结构后面追加约束
    alter table s_student add constraints class_unique unique(classid);
    --删除约束
    alter table s_student drop constraints class_unique ;
    
    • 加入注释
    --加入注释
    comment on table t_user is '学生表';
    comment on column t_user.ssid is '序号';
    comment on column t_user.spwd is '密码';
    comment on column t_user.gender is'性别';
    
    • 从已有表中拷贝
    --已有表中拷贝
    --create table 表名 as select 字段列表 from 已有表 where 1!=1;  
    --只拷贝结构不拷贝数据
    create table copy_t as select * from t_user where 1!=1;
    --结构和数据全部拷贝
    create table copy_t as select * from t_user ;
    
    • 删除表
    --不存在主外键约束:
    --drop table 表名 删除表
    drop table copy_t;
    --存在主外键约束:
    --1.先删除从表,再删除主表
    drop table s_student;
    drop table classes;
    --2.直接删除主表,级联删除主从表之间约束     
    --若表中存在主外键约束,则不法直接删除,加上cascade contraints可以删除关联的外键约束并且不影响表的数据
    drop table s_student cascade contraints;
    
    • 删除表中数据
    --不存在主外键关系:
    --指定对应数据,直接删除
    delete from s_student where sid=2;
    --存在主外键关系:
    --(1.)先删除从表中引用主表中当前这条数据的那些数据,然后再删除主表中的数据  
    -默认则从表中关联主外键关系的数据为空
    delete from classes where classid=2;
    --(2.)直接删除主表中的数据,一起把从表中引用了当前要删除的主表中的数据的这些子记录删除
    --前提是创建主外键关系时生了级联删除on delete cascade--外键
    constraints fk_classid foreign key(classid) references classes(classid) on delete cascade;
    --(3.)在删除主表中数据的时候,从表中引用了这个数据的子记录设置为null 
     --外键
    constraints fk_classid foreign key(classid) references classes(classid) on delete set null ;   
    
    • delete与数据截断的区别
    --删除数据  delete会开启事务 
    delete from tb_student;
    delete from clazz;
    --数据截断  truncate  不会开启事务
    --如果存在主从表关系,检查整个表结构是否有被引用,如果有结构上的引用就不能删除  
    truncate table tb_student;
    truncate table clazz;
    
    • 修改表的结构
    --修改表名 
    rename tb_txt to tb_txt_new; 
    --修改列名 
    alter table tb_txt_new  rename column  txtid to tid; 
    --修改类型 
    alter table tb_txt_new modify(tid varchar2(20)); 
    --添加列 
    alter table tb_txt_new add col varchar2(30); 
    --删除列 
    alter table tb_txt_new drop column col;
    --查看结果
    select * from tb_txt_new; 
    

    3、序列
    定义
    数据库表中的主键值有的时候我们会用数字类型的,并且自增。Sequence 是oracle提供的用于产生一系列唯一数字的数据库对象。
    mysql、sql server创建表的时候很容易实现。由于oracle中没有设置自增列的方法,所以我们在oracle数据库中主要用序列来实现主键自增的功能。
    使用工具|程序管理流水号,序列在创建时 没有与表关联 ,在操作数据时 与表关联

    • 创建序列
    --create sequence 序列名 start with 起始值 increment by 步进;
    create sequence seq_classid start with 100 increment by 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');
    --删除序列
    --drop sequence 序列名
    

    二、DML
    DML(Data Manipulation Language 数据操控语言)用于操作数据库对象中包 含的数据,也就是说操作的单位是记录,主要有insert、delete、update语句。
    1、事务
    事务的定义和特点
    事务是指作为单个逻辑工作单元执行的一组相关操作。这些操作要求全部完成或者全部不完成。使用事务是为了保证数据的安全有效。
    Oracle 默认的隔离级别是 read committed。(读已提交)
    事务有一下四个特点:(ACID)
    1)、原子性(Atomic):事务中所有数据的修改,要么全部执行,要么全部不执行。
    2)、一致性(Consistence):事务完成时,要使所有的数据都保持一致的状态,换言之:通过事务进行的所有数据修改,必须在所有相关的表中得到反映。
    3)、隔离性(Isolation):事务应该在另一个事务对数据的修改前或者修改后进行访问。
    4)、持久性(Durability):保证事务对数据库的修改是持久有效的,即使发生系统故障,也不应该丢失。
    事务的开启:
    还行DML语句时候 insert update delete
    事务的结束:
    提交:1).ddl语句 2).正常执行完 DCL 语句 C 3).正常退出客户端 4).commit
    失败: 1).rollback 2).非法退出客户端
    注意:rollback 只能对未提交的数据撤销,已经 Commit 的数据是无法撤销的,因为 commit之后已经持久化到数据库中。
    2、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;
    

    3、update

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

    4、删除

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

    相关文章

      网友评论

          本文标题:DDL&DML

          本文链接:https://www.haomeiwen.com/subject/lkhhzqtx.html