自动递增行中的MySQL替换
假设我有一个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') 我为
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你熟悉MySQLREPLACE
?@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'),该怎么办?这是一个好的用例吗?