dml语句 oracle_oracle数据库dml语句 - CSDN
精华内容
参与话题
  • oracle---DML语句

    2019-09-11 19:13:00
    DML: Data Manipulation Language 数据操纵语言,SQL的分类之一,命令使用户能够查询数据库以及操作已有数据库中的数据的计算机语言。此外还有DDL(Data Definition Language)数据定义语言和DCL(Data Control ...

    DML: Data Manipulation Language

          数据操纵语言SQL的分类之一,命令使用户能够查询数据库以及操作已有数据库中的数据的计算机语言。此外还有DDL(Data Definition Language)数据定义语言和DCL(Data Control Language)数据控制语言。

    • 主要内容:

            insert
            update
            delete
            ------------事务
            commit
            savepoint
            rollback

    • sql语句的分类:

            select查询语句
            DML
            DDL
            DCL
            事务控制语句 TCL

        DML: insert  update  delete

    • 测试使用的表: 没有主外键关联

    create table t_user(
            id number,
            name varchar2(50) constraint user_name_nn not null,
            email varchar2(50),
            gender char(1),
            age number,
            birthday date,
            constraint user_id_pk primary key(id),
            constraint user_email_un unique(email),
            constraint user_gender_ck check(gender in('f','m'))
        );

    //drop table t_user;      可删除表

    • insert语句:

    向表中插入数据:
            //默认是向表中的每一个列中【依次】插入数据
            insert into t_user values(1,'tom','abc','f',20,'11-8月-98');
            注:违反任意一种约束那么就插入数据失败

     //也可以指明向表中的哪些列插入数据
       //注意:可以任意交换下面列名的位置,只有values语句中的值也对应交换即可
            insert into t_user(id,name,email,gender,age,birthday) values(2,'tom','abc1','f',20,'11-8月-98');

       //列的值可以是null的话,那么也在插入的时候不指定这个列
       //注意:unique约束和check约束的值,都可以为null
        //注意:主键约束和非空约束的值,都不可以为null
            insert into t_user(id,name,email,gender) values(3,'tom','abc3','f');
            insert into t_user(id,name,email) values(4,'tom','abc4');
            insert into t_user(id,name) values(5,'tom');

    //使用【运行时参数】设置需要输入表中的值
            insert into t_user(id,name) values(&id,'&name');
                           若没有单引号 则输入时手动添加单引号

     //把查询的结果 插入到表中
            //前提是查询的列的顺序和要插入表中列的顺序是一致的,这个一致指的的是【数据类型是一种的
            insert into t_user(id,name,birthday) 
            select id,last_name,start_date 
            from s_emp
            where id>6;

    • update语句

          //修改表中所有数据的age值为20岁
            update t_user set age=20;
            
            //修改表中所有数据的age和gender的值
            update t_user set age=25,gender='m';
            
            //修改表中id小于10数据的age和gender的值为null
            update t_user 
            set 
            age=null,gender=null 
            where id<10;
            
            //修改id为18的用户的名字为zhangsan
            update t_user set name='zhangsan' where id=18;
     

    • delete语句

        delete from 表名 
        delete from 表名 where 条件

        
            //删除表中id大于20的用户信息
            delete from t_user where id>20;
            
            //删除名字为张三的用户信息
            delete from t_user where name='zhangsan';
            
            //删除表中所有的数据
            delete from t_user;
    --------------------------------------------------------------------------

    • 测试使用的表: 主外键关联

        create table t_customer(
                id number,
                name varchar2(20) constraint customer_name_nn not null,
                constraint customer_id_pk primary key(id)
        );

        create table t_order(
            id number,
            price number,
            customer_id number,
            constraint order_id_pk primary key(id),
            constraint order_cid_fk foreign key(customer_id) references t_customer(id)
        );

    • insert语句:

    //t_customer表中插入数据
            insert into t_customer(id,name) values(1,'tom1');
            insert into t_customer(id,name) values(2,'tom2');
            insert into t_customer(id,name) values(3,'tom3');

     //t_order表中插入数据
          //customer_id外键列的值必须是t_customer表中出现过的
            insert into t_order(id,price,customer_id) values(1,1000,1);
            insert into t_order(id,price,customer_id) values(2,2000,2);

            //插入出错,因为6这个值并没有在t_customer表中出现过的
            insert into t_order(id,price,customer_id) values(3,3000,6);


     //t_order表中插入数据
            //默认情况下,外键列上的值是可以为空的
            insert into t_order(id,price,customer_id) values(3,3000,null);
            insert into t_order(id,price) values(4,4000);
            注意:如果在外键列上加一个非空约束,那么这个外键列的值就不能为null了(可以给一个列上添加多种约束)
           

      //t_order表中插入数据
            //默认情况下,外键列上的值是可以重复的
            insert into t_order(id,price,customer_id) values(5,5000,1);
            insert into t_order(id,price,customer_id) values(6,6000,1);
            注意:如果在外键列上加一个唯一约束,那么这个外键列的值就不能重复了(可以给一个列上添加多种约束)

    • update语句:

    把两个测试表删除了重新创建,然后向表中插入一些数据
            //t_customer表中插入数据
            insert into t_customer(id,name) values(1,'tom1');
            insert into t_customer(id,name) values(2,'tom2');
            insert into t_customer(id,name) values(3,'tom3');
            //t_order表中插入数据
            insert into t_order(id,price,customer_id) values(1,1000,1);
            insert into t_order(id,price,customer_id) values(2,2000,2);
            
            //把t_order表中id=1的数据的customer_id列修改为3
            update t_order set customer_id = 3 where id = 1;

            //把t_order表中id=1的数据的customer_id列修改为null
            update t_order set customer_id = null where id = 1;
        
            //把t_order表中id=1的数据的customer_id列修改为20
            //sql执行出错,因为就没id=20的顾客
            update t_order set customer_id = 20 where id = 1;

    • delete语句:

    //删除t_order表中的的所有数据
            //可以成功删除,没有问题,因为删除t_order不会对t_costomer表的数据产生任何影响
            delete from t_order;
            
            //t_order表中插入数据
            insert into t_order(id,price,customer_id) values(1,1000,1);
            insert into t_order(id,price,customer_id) values(2,2000,2);

            
            //删除t_customer表中id=3的数据
            //删除成功,因为t_order表中外键列中没有引用过这个值
            delete from t_customer where id = 3;

            //删除t_customer表中id=1的数据
            //删除失败,因为t_order表中外键列中已经引用了这个值
            delete from t_customer where id = 1;

           【在这种情况下,on delete 语句就可以起作用了】

    • 【on delete语句】

           on delete no action(默认情况:什么不都写)
            on delete cascade
            on delete set null    //引用的外键设为null

          on delete语句是在声明外键约束的时候使用的。用户在删除A表中的一条数据,而这条数据被B表中的外键列所引用了,这个时候on delete语句的设置可以告诉oracle这个时候该如何处理:      
            如果在建外键的时候,不加on delete语句,就是on delete no action.

    例如1: on delete no action


            create table t_customer(
                id number,
                name varchar2(20) constraint customer_name_nn not null,
                constraint customer_id_pk primary key(id)
            );

        create table t_order(
                id number,
                price number,
                customer_id number,
                constraint order_id_pk primary key(id),
                constraint order_cid_fk foreign key(customer_id) references t_customer(id)
            );

        插入测试数据:
            //t_customer表中插入数据
            insert into t_customer(id,name) values(1,'tom1');
            insert into t_customer(id,name) values(2,'tom2');
            insert into t_customer(id,name) values(3,'tom3');
            //t_order表中插入数据
            insert into t_order(id,price,customer_id) values(1,1000,1);

    //删除失败
            //ORA-02292: 违反完整约束条件 - 已找到子记录
            delete from t_customer where id = 1;

    例如2: on delete cascade  级联删除


            建表语句和测试数据上例1相同,只是在【声明外键列】的时候加入on delete cascade语句
            create table t_order(
                id number,
                price number,
                customer_id number,
                constraint order_id_pk primary key(id),
                constraint order_cid_fk foreign key(customer_id) references t_customer(id) on delete cascade
            );

                
            //同样做删除测试
            //删除成功,同时级联(cascade)删除了t_order表中所关联的那条数据
            delete from t_customer where id = 1;

    例如3: on delete set null
            

    建表语句和测试数据上例1相同,只是在声明外键列的时候加入on delete set null语句
            create table t_order(
                id number,
                price number,
                customer_id number,
                constraint order_id_pk primary key(id),
                constraint order_cid_fk foreign key(customer_id) references t_customer(id) on delete set null
            );

                
            //同样做删除测试
            //删除成功,同时把t_order表中所关联的那条数据的外键设置为了null
            delete from t_customer where id = 1;

    • 数据库事务

    事务:  是对数据库中的数据的操作,需要在一个事务中进行,事务可以对DML语句提供保障。

            1.【DML】语句执行的时候,如果当前有事务,那么就使用这个事务,如果当前没有事务,这个执行的DML语句就会产生一个新的事务。
            2.【只有DML语句才会产生事务】,其他语句不会产生事务。
            3.commit/rollback/DDL语句都可以把当前事务给结束
            4.commit和DDL语句结束事务的方式是把这个事务给提交
            5.rollback结束事务的方式是把这个事务给回滚了

    注:
                【提交事务】是指让这个事务里面的所有操作都【生效】到数据库中
                【回滚事务】是指让这个事务里面的所有操作都【撤销】

    • 测试用的表:

            create table t_customer(
                id number,
                name varchar2(20) constraint customer_name_nn not null,
                constraint customer_id_pk primary key(id)
            );
           // drop table t_customer;    (删除表)

            测试: 使用俩个终端窗口,同一个账号登录到数据库中,观察事务是否提交对用户查看数据的影响
            注:一个用户对A表做了DML操作,但是没有提交事务,这时候别的用户是不能对A表再做其他的DML操作。(为了保证数据的安全和一致性)

      例如1:
            insert ....产生事务A
            update ... 这个操作是事务A中的操作
            insert ..  这个操作是事务A中的操作
            commit;    让事务A里面的三个操作生效、事务A结束
            delete ... 产生新的事务B
            insert ..  这个操作是事务B中的操作
            insert ..  这个操作是事务B中的操作
            insert ..  这个操作是事务B中的操作
            rollback;  让事务B中的四个操作都撤销,事务B结束

    例如2:
            insert ....产生事务A
            update ... 这个操作是事务A中的操作
            insert ..  这个操作是事务A中的操作
            DDL语句;   事务A会被提交,事务A结束
            rollback;  这时候回滚已经对事务A不起作用,因为事务A以及被提交了,当前已经没有事务了
            
            【注:create语句 drop语句 alter语句等都属于DDL语句, DDL自动提交事务;

    • 事务特征ACID:

           1、原子性:Atomicity
                同时成功或者同时失败
           2、 一致性:Consistency 
                事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。
            3、隔离性:Isolation 
                事务操作应该相互独立
            4、持久性:Durability 
                事务所做的影响 ,在事务结束之后应该能够是持久的。

    • isolation  事务隔离级别

    事务中产生的问题:

            1.脏读  主要针对update操作。 一个事务A读到另一个事务B中修改过但是还没有提交的数据

            2.不可重复读  主要针对update操作。 一个事务A在第一次读数据和第二次读数据之间,有另一个事务B把这个数据更改并提交了,所以就出现了事务A里面读一个数据两次,但是读到的结果是不同的。

            3.幻读  主要针对的是insert/delete操作。事务A第一次用where条件筛选出了10条数据,事务A第二次用同样的where条件筛选出的却是11条数据,因为事务B在事务A的第一次和第二次查询之间进行了插入操作,并且插入的这个数据满足事务A的where筛选条件.

    • 事务隔离级别有:

            read-uncommitted  不提交也能读
            read-committed    提交之后才能读 解决了脏读
            repeatable-read   解决了脏读和不可重复读
            serializable      三个问题都解决了

    级别越高解决的问题越多但是效率越低。

    注意:并不是所有数据库都支持这四种事务隔离级别,【比如oracle就只支持第二种和第四种这俩种,比如mysql就四种全支持.】

            【oracle里面默认的事务隔离级别是第二种:read-committed】

            oralce里面设置事务隔离级别:
            Set Transaction Isolation Level Read Uncommitted
            Set Transaction Isolation Level Read Committed
            Set Transaction Isolation Level Read Repeatable
            Set Transaction Isolation Level Serializable

    • 回滚点/保存点 savepoint

            例如:
            DML语句1
            savepoint A
            DML语句2
            savepoint B
            DML语句3
            rollback to A/B

            这个时候可以通过这个回滚点让事务回滚到指定的位置,如果不指定回滚点而是直接rollback,那么事务会一下子回滚完.

            【特别注意】:rollback到回滚点之后,这个事务并没结束,这个时候还可以接着回滚或者commit提交事务。

    create table t_user(
                id number primary key,
                name varchar2(100),
                salary number
            );
       //     drop table t_user;    (删除表操作)


            例如:
            insert into t_user values(1,'tom',1000);
            savepoint A;
            insert into t_user(id,name) values(2,'zs');
            savepoint B;
            delete from t_user;
            rollback to B;

            然后查询看结果:
            select * from t_user;

    loading....................

    展开全文
  • oracleDML语言

    2018-08-28 19:05:08
    DML 数据操作语言 manipulation – insert 插入、update 更新、delete 删除 – 给 tb_user 表插入数据 insert into tb_user(name, age, sex) values (‘Jss’, 18, ‘男’); – 如果没有指定列名,则默认是...

    – DML 数据操作语言 manipulation
    – insert 插入、update 更新、delete 删除

    – 给 tb_user 表插入数据
    insert into tb_user(name, age, sex)
    values (‘Jss’, 18, ‘男’);
    – 如果没有指定列名,则默认是全部的
    insert into tb_user
    values (‘翠花’, 17, ‘女’);
    – 如果只是指定部分值的话,必须要指定对应的列名
    insert into tb_user(name, sex)
    values (‘春花’, ‘女’);

    commit;

    – 如果我们在当前用户下提交数据的时候,只能当前用户访问的到
    – 其他用户如果也想访问的话,需要我们进行“提交”
    – 如果需要提交的话,有两种做法
    – 1)点击工具栏上面的绿色提交按钮
    – 2)在插入语句后面,写上 commit 即可进行提交。
    – 如果没有提交,数据相当于是在缓存中,并没有保存到物理文件中。

    – Oracle 中是不会自动提交的,需要开发者手动操作。
    – MySQL 是自动提交的。

    – 更新数据
    – 更改年龄
    update tb_user
    set age = 20
    where name = ‘Jss’;

    – 更改两列信息
    update tb_user
    set name = ‘小翠花’, sex = ‘男’
    where name = ‘翠花’;

    – 修改所有男生的年龄为 18
    update tb_user
    set age = 18
    where sex = ‘男’;

    – 修改所有男生和春花的年龄改为 20
    update tb_user
    set age = 20
    where sex = ‘男’ and name = ‘春花’;

    – and 同时满足两个条件
    – or 只要满足其中一个条件即可
    update tb_user
    set age = 20
    where sex = ‘男’ or name = ‘春花’;

    – 删除数据
    – 删除表中的所有数据
    delete from tb_user;

    – 删除 Jss 数据
    delete from tb_user where name = ‘Jss’;

    – 删除 小翠花 的年龄
    delete tb_user set age = null where name = ‘小翠花’;

    – 删除男的春花
    delete from tb_user where name = ‘春花’ and sex = ‘男’;

    – 删除女的春花
    delete from tb_user where name = ‘春花’ and sex = ‘女’;

    – 思考:如果我要删掉第二条女的春花,怎么办?

    – 先给表添加一个 id 列
    alter table tb_user add(id int);

    – alter 是用来修改表的结构,如果要修改表中的数据,需要使用 update
    select * from tb_user;

    展开全文
  • oracle DML、DDL语句区别

    千次阅读 2014-01-03 17:57:00
    DML:数据操作语言,SQL中处理数据等操作统称为数据操纵语言  它们是SELECT、UPDATE、INSERT、DELETE,就象它的名字一样,这4条命令是用来对数据库里的数据进行操作的语言,不修改表的结构,只修改表的内容 需要...
    DML:数据操作语言,SQL中处理数据等操作统称为数据操纵语言

           它们是SELECT、UPDATE、INSERT、DELETE,就象它的名字一样,这4条命令是用来对数据库里的数据进行操作的语言,不修改表的结构,只修改表的内容

    需要commit 才能真正被执行



    DDL:数据定义语言,用于定义和管理 SQL 数据库中的所有对象的语言

           DDL比DML要多,主要的命令有CREATE、ALTER、DROP等,DDL主要是用在定义或改变表(TABLE)的结构,数据类型,表之间的链接和约束等初始化工作上,他们大多在建立表时使用



    DCL:数据控制语言,用来授予或回收访问数据库的某种特权,并控制数据库操纵事务发生的时间及效果,对数据库实行监视等

           是数据库控制功能。是用来设置或更改数据库用户或角色权限的语句,包括(grant,deny,revoke等)语句。在默认状态下,只有sysadmin,dbcreator,db_owner或db_securityadmin等人员才有权力执行DCL
    展开全文
  • from dual 调用函数的时候,报ORA-14551: 无法在查询中执行 DML 操作。 解决方法: 函数声明时IS后面加 PRAGMA AUTONOMOUS_TRANSACTION;,操作语句后再加 COMMIT; 关于PRAGMA AUTONOMOUS_TRANSACTION(自治...

    用select ... from dual 调用函数的时候,报ORA-14551: 无法在查询中执行 DML 操作。


    解决方法:

    函数声明时IS后面加 PRAGMA AUTONOMOUS_TRANSACTION;,操作语句后再加 COMMIT;


    关于PRAGMA AUTONOMOUS_TRANSACTION(自治事务)的解释:http://blog.sina.com.cn/s/blog_4f925fc30100h8ld.html

    展开全文
  • Oracle 存储过程中的循环语句写法

    万次阅读 2016-05-23 20:30:32
    首先科普一下:  ...当执行一条DML语句后,DML语句的结果保存在四个游标属性中,这些属性用于控制程序流程或者了解程序的状态。当运行DML语句时,PL/SQL打开一个内建游标并处理结果,游标是维护查询结果
  • 88.Oracle数据库SQL开发之 修改表内存——数据库事务的开始和结束 欢迎转载,转载请标明出处: 事务既有起点,也有终点。 下列之间之一发生,事务开始了: l 连接数据库上,并执行一条DML语句 l 前一个事务结束后...
  • oracle 中触发器,commit 的问题

    万次阅读 2011-07-05 22:47:10
    触发器无需commit也不能写commit触发器和触发它的DML是同一个事务DML提交了,触发器的操作也提交了,要不就一起回滚了当然,如果你一定要在触发器里写COMMIT那就用自治事务相当于一个事务里的子事务正常情况下,...
  • oracle什么时候需要commit

    万次阅读 多人点赞 2012-06-05 10:37:17
    今天在oracle的SQL plus 中执行了删除和查询操作,然后在PL/SQL中也执行查询操作,语句一样,结果却不一样,让我大感郁闷,后来才突然想到可能是两边数据不一致造成的,但是为什么不一致呢,就是没用commit, ...
  • oracle存储过程处理ddl与dml语句

    千次阅读 2017-02-10 15:53:26
    declare  CURSOR C_EVENT is select table_name from user_tables@DBLINK_YWKDB;   temp varchar2(100); begin    OPEN C_EVENT;   FETCH C_EVENT into temp;  while C_EVENT%found ... 
  • Oracle事务的隐式提交

    千次阅读 2013-11-13 14:16:41
    又名自动提交,即无需显示执行commit语句,session中的操作被自动提交到数据库的过程。 隐式提交的方式 1、正常执行完ddl语句。包括create,alter,drop,truncate,rename。 2、正常执行完dcl语句。包括grant,...
  • 需求:公司一系统升级,要维护的数据库表中已有数据,该表没有序列、触发器等。此表要直接插入一些数据,插入的数据为了和...而本人oracle数据库(应该说所有数据库)很菜,不会啊,于是找度娘,发现如下两篇资料对我有
  • 行级触发器对DML语句影响的每个行执行一次,触发器表(如:您的定义触发器的emp表)变化一个记录(I、D、U)就执行一次。 语句级触发器对每个DML语句执行一次,完成一次“事务”触发一次。 如果在TABLE表中插入的...
  • oracle中的sql%found sql%notfound和sql%rowcount
  • oracle中使用sql语句执行了delete和update和insert命令,在本地数据库中已执行成功查看并没有删除成功或更新数据库,很是尴尬,为什么会出现这种不一致的情况呢? 原来是因为我执行命令后没有commit提交,那么...
  • SQL主要程序设计语言 数据定义语言DDL(Data Definition ...数据操作语言DML(Data Munipulation Language) 如 insert、update、delete, 数据控制语言DCL(Data Control Language) 如 grant、revoke Connection conn
  • oracle:何时需要commit命令提交

    千次阅读 2016-11-25 08:12:51
    SQL语言分为五大类: DDL(数据定义语言) - Create、Alter、Drop ...DML(数据操纵语言) - Insert、Update、Delete 这些语句需要Commit才能提交。 DTL(事务控制语言) - Commit、Rollback 事务提交与回滚语句。 DCL(数据
  • 数据操作语言 (DML) 语句

    千次阅读 2013-11-12 23:34:36
    DML语句不会隐私提交当前事务。以下是数据操作语言语句: CALL DELETE EXPLAIN PLAN INSERT LOCK TABLE MERGE SELECT UPDATE SELECT语句是MDL语句的有限形式,它只能在数据库中访问数据。虽然它可以在查询...
  • Oracle的触发器中执行DDL语句

    千次阅读 2008-05-15 00:12:00
    触发器无需commit也不能写commit触发器和触发它的DML是同一个事务DML提交了,触发器的操作也提交了,要不就一起回滚了当然,如果你一定要在触发器里写COMMIT那就用自治事务相当于一个事务里的子事务正常情况下,...
  • Oracle 事务的开始与结束

    千次阅读 2015-08-20 11:48:47
    连接到数据库上,并执行了第一天 DML 语句; 当前一个事务结束后,又输入了另外一条 DML 语句; 当下列事件之一发生时,事务就结束了: 执行 COMMIT 或 ROLLBACK语句;执行一条 DLL语句,例如 CREATE TABLE 语句...
  • oracle中DDL和DML指什么?

    千次阅读 2011-07-26 09:33:16
    【DDL】 create table 创建表 alter table 修改表 drop table 删除表 truncate table 删除表中所有行 create index 创建索引 drop index 删除索引当执行DDL语句时,在每一条语句前后,oracle都将提交当前的事务。...
1 2 3 4 5 ... 20
收藏数 55,752
精华内容 22,300
关键字:

dml语句 oracle