自动递增行中的MySQL替换

自动递增行中的MySQL替换,mysql,replace,innodb,Mysql,Replace,Innodb,假设我有一个MySQL表,它包含三列:id、a和b,名为id的列是一个自动递增的字段。如果我将如下查询传递给MySQL,它将正常工作: REPLACE INTO `table` (`id`, `a`, `b`) VALUES (1, 'A', 'B') 但是如果我跳过id字段,它将不再工作,这是意料之中的 我想知道是否有办法在REPLACE查询中忽略一些字段。所以上面的查询可以是这样的: REPLACE INTO `table` (`a`, `b`) VALUES ('A', 'B') 我为

假设我有一个MySQL表,它包含三列:
id
a
b
,名为
id
的列是一个
自动递增的
字段。如果我将如下查询传递给MySQL,它将正常工作:

REPLACE INTO `table` (`id`, `a`, `b`) VALUES (1, 'A', 'B')
但是如果我跳过
id
字段,它将不再工作,这是意料之中的

我想知道是否有办法在
REPLACE
查询中忽略一些字段。所以上面的查询可以是这样的:

REPLACE INTO `table` (`a`, `b`) VALUES ('A', 'B')
我为什么需要这样的东西?

有时我需要使用
SELECT
查询检查数据库,以查看行是否存在。如果存在,则需要更新现有行,否则需要插入新行。我想知道是否可以通过一个
REPLACE
查询获得类似的结果(但不相同)

为什么结果不一样呢?因为
REPLACE
删除现有行,并将
插入新行,这将丢失当前的
主键
,并增加自动递增值。相反,在
UPDATE
查询中,
primary key
AI
字段将保持不变

MySQL。

  • 这不是你应该用的方法
  • 仅当您知道
    主键
    值时,才使用replace
手册:

请注意,除非表具有主键或唯一索引,否则使用 REPLACE语句毫无意义。它相当于插入, 因为没有用于确定新行是否 复制另一个


如果有多个与字段匹配的行怎么办

考虑添加一个可以匹配的密钥,并使用
INSERT IGNORE。。在重复密钥更新时
。“插入忽略”的工作方式与“替换”略有不同

“插入忽略”非常快,但可能有一些看不见的副作用

插入。。。在重复密钥更新时

它的副作用较少,但速度可能要慢得多,特别是对于MyISAM、大量写入负载或大量索引表

有关副作用的更多详细信息,请参阅:

使用INSERT IGNORE似乎可以非常快速地查找列数很少的MyISAM表(可能只是一个VARCHAR字段)

比如说,

create table cities (
    city_id int not null auto_increment,
    city varchar(200) not null,
    primary key (city_id),
    unique key city (city))
    engine=myisam default charset=utf8;

insert ignore into cities (city) values ("Los Angeles");
在这种情况下,重复地重新插入“Los Angeles”将根本不会导致对表的任何实际更改,并将阻止生成新的自动增量ID,这有助于防止ID字段耗尽(使用大量搅动的表上的所有可用自动增量范围)


为了获得更快的速度,在插入之前使用一个类似幽灵哈希的小哈希,并将其用于单独的唯一键列,这样varchar就不会被索引。

我无法理解您的问题。你到底想做什么?@fathahrhmanp你熟悉MySQL
REPLACE
?@Mahdi-请在REPLACE查询之前提供表数据,以及在REPLACE查询之后提供预期的输出。我会尽力给你答案solution@FathahRehmanP我已经更新了我的问题:)1)共享正确的表架构。2) 这不是你应该用的方法。3) 仅当您知道
主键
值时才使用replace。另外,请注意:如果忽略插入,则
上次插入id()
中的值未定义。因此,您不必使用该选项,而是必须在插入忽略后执行
从cities where city=“Los Angeles”
中选择city\u id,以确保获得良好的id值(如果需要)。即使如此,与重复密钥更新时的
相比,这仍然要快得多,因为(几乎总是)写入速度比读取速度慢。(在Innodb上,如果需要,可以使用事务处理。)如果要进行向下投票,请添加一条注释,解释您认为这是无效点的原因。在Postgresql中,这被称为UPSERT。如果我们有一个唯一的索引,比如列
a
,我想将
替换为
表`(
a
b
)值('a','b'),该怎么办?这是一个好的用例吗?