本帖最后由 setoy 于 2012-06-27 19:09:25 编辑

解决方案 »

  1.   

    本帖最后由 xuzuning 于 2012-06-27 19:07:40 编辑
      

  2.   

    你都不看手册的吗?这样如何进步?CREATE [UNIQUE|FULLTEXT] INDEX index_name
           ON tbl_name (col_name[(length)],... )
    REPLACE [LOW_PRIORITY | DELAYED]
            [INTO] tbl_name [(col_name,...)]
            VALUES (expression,...),(...),...
    or  REPLACE [LOW_PRIORITY | DELAYED]
            [INTO] tbl_name [(col_name,...)]
            SELECT ...
    or  REPLACE [LOW_PRIORITY | DELAYED]
            [INTO] tbl_name
            SET col_name=expression, col_name=expression,...REPLACE 功能与 INSERT 完全一样,除了如果在表中存在一个老的记录与新记录在一个 UNIQUE 或 PRIMARY KEY 上有相同的值,那么在新记录被插入之前,老的记录将被删除。查看章节 6.4.3 INSERT 句法。 换句话说,你不可以从一个 REPLACE 中访问老的记录行的值。某些老的 MySQL 版本中,你或许可以这样做,但是这是一个 Bug,现在已被修正了。 为了能够使用 REPLACE,你必须有对该表的 INSERT 和 DELETE 权限。 当你使用一个 REPLACE 时,如果新的记录行代替了老的记录行,mysql_affected_rows() 将返回 2。这是因为在新行被插入之前,重复记录行被先删除了。 这个事实使得判断 REPLACE 是否是添加一条记录还是替换一条记录很容易:检查受影响记录行的值是 1 (添加)还是 2(替换)。 注意,除非你使用一个 UNIQUE 索引或 PRIMARY KEY ,使用 REPLACE 命令是没有感觉的,因为它会仅仅执行一个 INSERT。
      

  3.   

    谢谢!
    手册也看了,对于replace我的理解也是需要“索引”或primarykey。
    而且replace都重复记录是先删除再插入,性能多少有损。
    能不能先判断重复然后直接插入的?
      

  4.   

    那你就这样: insert ignore into .............
    但是也要在 cat 和 article 上做联合唯一索引
      

  5.   

    最笨的办法就是插入前,select一下是否该值已存在。
      

  6.   

    repalce into tablename(id,name) values('.$id.','".$name."');  or replace into tablename(id,name) select id,name
      

  7.   

    按楼主的想法先select再insert这种方式还不如replace呢
      

  8.   

    建议用replace,比较简单高效。
      

  9.   

    select 白瞎,又不锁表, 根本不是原子的,白判断。直接唯一索引插入看结果。
      

  10.   

    唉~ 还是建立了唯一索引,然后insert ignore了。