我用adoquery导入access到sql: access,sql都有表image ,字段userid ,image1,image2,image3,image4;其中userid是主建 我想将access的数据导入sql中,如果sql中已经有数据的话 侧用 access的 数据update sql的 数据。 如果没有的话就append。 我想问的是~ 先把access的数据查出来 然后一条一条的 和sql的 比对 
,来 确定update 或append,跟把sql中已经存在于access的数据全部delete,然后在用access insert into sql 。这样做的话是比前种方法一条一条的 快,但不 知道有 什么副作用嘛,比如说索引,或者日志什么的 。

解决方案 »

  1.   

    两个方法结果是不同的:
    1、如果存在sql有access没有的纪录,方法一会保留数据,而方法二会删除数据
    2、索引不会有问题,日志要看你delete数据的方法,如果用truncate table语句,不记录日志,速度快,如果用delete语句则可能记录很多日志
    3、总的速度,应该先删除快,因为不必一条一条循环操作
      

  2.   

    to: Haiwer 谢谢~ 我会在方法2 种删除数据的 时候做选择~  不删除sql有access没有的纪录》
      

  3.   

    to: Haiwer 
       我 刚刚看了 truncate table  好像要删除整个表哦~  那就不能选择要删除的数据了 ~
    那请问如果我用delete ,来选择的 话 。产生是日志怎么办呢 ·谢谢~
      

  4.   

    但是 truncate table 不能带 where ·  那就整个表都 删除了 ~  我只想删除access存在的记录~
      

  5.   

    要選擇的刪除 只能DELETE了
    truncate 和不带 where 子句的 delete,以及 drop 都会删除表内的数据 不同点:1. truncate 和 delete 只删除数据不删除表的结构(定义) 
      drop 语句将删除表的结构被依赖的约束(constrain)、触发器(trigger)、索引(index);依赖于该表的存储过程/函数将保留,但是变为 invalid 状态。2. delete 语句是数据库操作语言(dml),这个操作会放到 rollback segement 中,事务提交之后才生效;如果有相应的 trigger,执行的时候将被触发。
      truncate、drop 是数据库定义语言(ddl),操作立即生效,原数据不放到 rollback segment 中,不能回滚,操作不触发 trigger。3.delete 语句不影响表所占用的 extent,高水线(high water)保持原位置不动 
    显然 drop 语句将表所占用的空间全部释放。
    truncate 语句缺省情况下见空间释放到 minextents个 extent,除非使用reuse storage;truncate 会将高水线复位(回到最开始)。4.速度,一般来说: drop> truncate > delete 5.安全性:小心使用 drop 和 truncate,尤其没有备份的时候.否则哭都来不及 
    使用上,想删除部分数据行用 delete,注意带上where子句. 回滚段要足够大. 
    想删除表,当然用 drop 
    想保留表而将所有数据删除,如果和事务无关,用truncate即可。如果和事务有关,或者想触发trigger,还是用delete。
    如果是整理表内部的碎片,可以用truncate跟上reuse stroage,再重新导入/插入数据。
      

  6.   

    to:wufeng4552   谢谢您~  我又长见识了 ~
      那你觉得我提的 问题用第一方法~  update呢 ~    还是 用delete where  然后在 insert into。
      

  7.   

    我 的 数据很多~  日志也很大我怕 每次都delete  日志太大了 不好
      

  8.   

    在网上看了看 ~  发现我的问题其实就是 入库时存在更新库存数,不存在插入记录  ;--更新两表都有的数据 
    update   B 
    from   A   
            inner   join   B   on   A.id=B.id --追加A中有,而B中没有的数据 
    insert   into   B 
    select   A.* 
    from   A   
            left   join   B   on   A.id=B.id 
    where   B.id   is   null 这样的话就不用删除了 ~   请问是不是这样的~~~?????谢谢·
      

  9.   

    考虑速度和数据安全,建议:
    1、把access数据倒入一张空表
    2、用语句update 目的表 set
       col1=a.col1
       col2-a.col2
       ...
    from 目的表,临时空表 a
    where 目的表.主键=a.主键insert 目的表(...)
    select ... from 临时空表 a
    where not exists (
      select 1 from 目的表
      where 目的表.主键=a.主键
     )drop table 临时空表
      

  10.   


    你把access存在的记录先插入到临时表
    truncate table后将临时表的东西再导入回去撒
      

  11.   

    谢谢各位·我是这样做的 ~ 好像不用建临时表了吧~update sql set
       sql.col=access.col1
    from access 
    where  (access.主键 in (select 主键  from sql) )insert sql
    select * from access
    where   (access.主键 not in (select 主键  from sql) )
    请指教~~~
      

  12.   

    not in 是效率极低的写法。
    12楼的方法就很好。
      

  13.   

      我 用下面两个语句操作image字段的 时候--
    update  B set B.iamge =A.image from  A inner  join  B  on  A.id=B.id  

    insert  into  B select A.* from  A left  join  B  on  A.id=B.id where  B.id  is  null 
    其中update 的时间很长,比Truncate TABLE B 然后在 insert into b 慢很多~  
    请问这是为什么?