如何在 REPLACE 更新相同记录的时候 auto_increment 不增加……

platinum 2003-12-08 11:25:51
有这么一个表 parts,有三个字段:id name price

id 是 int、auto_increment
name 和 price 都是 varchar(200)
两个索引,PRIMARY 对应 id,一个 unique 对应 name

本打算导入的时候

REPLACE INTO parts (name, price) VALUES ("商品1", "21.12"), ("商品2", "23.12"), (……

这样批量导入,如果 name 相同,只更新价格,如果之前没有 name,就增加一个新行,但问题是,老的商品更新价格以后总行数虽然不变,但该行的 id 变成最新的了,而这个 id 和其他表之前还有些联系,如何让他不增加、仅仅是在插入新行的时候增加?是我的索引建的不正确还是说 MySQL 本身无法解决这个问题、只能是我每增加一行的时候都要用 select 做个检测?(那样效率超低啊……)

不知道我说明白没……
...全文
180 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
fish21cn 2003-12-10
  • 打赏
  • 举报
回复
就算事务被ROLLBACK,auto_increment还是会自动增加.
小子侯 2003-12-09
  • 打赏
  • 举报
回复
replace就是这样的,用insert into 表名 select * from 表名;
loveflea 2003-12-08
  • 打赏
  • 举报
回复
2、insert into a select * from c;
loveflea 2003-12-08
  • 打赏
  • 举报
回复
其实和你select的原理一样;只是可能速度快一点!
loveflea 2003-12-08
  • 打赏
  • 举报
回复
建议:

1、将新表b里有的旧表a里没有的记录,保存到c表;并删除b里对应的记录!
2、insert into a select * from b;
3、update a,b set a.price=b.price where a.name=b.name
platinum 2003-12-08
  • 打赏
  • 举报
回复
用 REPLACE 还是别的什么无所谓的事情,只要解决问题

我的意思是不想每更新一条记录之前都要先 select 一下以决定是 update 还是 insert,除了这个最笨的方法还有没有什么别的
loveflea 2003-12-08
  • 打赏
  • 举报
回复
REPLACE 功能与 INSERT 完全一样,除了如果在表中存在一个老的记录与新记录在一个 UNIQUE 或 PRIMARY KEY 上有相同的值,那么在新记录被插入之前,老的记录将被删除。查看章节 6.4.3 INSERT 句法。

所以该行的 id 变成最新的了


6.4.8 REPLACE句法

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。
shuixin13 2003-12-08
  • 打赏
  • 举报
回复


先将所有的新增记录插入到一个新表中去,

然后用一个INSERT .. SELECT .. LEFT JOIN .. 语句进行处理,
其它真的没什么好的办法了,




对于这种做法的效率,
你可以完全放心,
只有创建必要的索引,
这还算是个好办法,


56,677

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧