5

假设我有一个 MySQL 表,其中包含三列:ida并且b名为的列id是一个AUTO INCREMENT字段。如果我将如下查询传递给 MySQL,它将正常工作:

REPLACE INTO `table` (`id`, `a`, `b`) VALUES (1, 'A', 'B')

但是,如果我跳过该字段id,它将不再起作用,这是意料之中的。

ignore我想知道查询中的某些字段是否有方法REPLACE。所以上面的查询可能是这样的:

REPLACE INTO `table` (`a`, `b`) VALUES ('A', 'B')

为什么我需要这样的东西?

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

为什么不能是同样的结果?仅仅是因为现有的行和新的行将REPLACE丢失当前行并增加自动递增的值。相反,在查询中,字段将保持不变。DELETEINSERTprimary keyUPDATEprimary keyAI

MySQL替换

4

2 回答 2

10
  • 这不是您应该使用替换的方式。
  • 仅当您知道primary key值时才使用替换。

手动的:

请注意,除非表具有 PRIMARY KEY 或 UNIQUE 索引,否则使用 REPLACE 语句是没有意义的。它变得等同于 INSERT,因为没有用于确定新行是否与另一行重复的索引。

于 2013-03-05T09:07:30.857 回答
2

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

考虑添加一个可以匹配和使用的密钥INSERT IGNORE.. ON DUPLICATE KEY UPDATE。INSERT IGNORE 的工作方式与 REPLACE 略有不同。

INSERT IGNORE 非常快,但可能会产生一些不可见的副作用。

INSERT... ON DUPLICATE KEY UPDATE

它的副作用较少,但可能要慢得多,尤其是对于 MyISAM、繁重的写入负载或重索引的表。

有关副作用的更多详细信息,请参阅: https ://stackoverflow.com/a/548570/1301627

使用 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”根本不会导致对表进行任何实际更改,并且会阻止生成新的 auto_increment ID,这有助于防止 ID 字段耗尽(用完所有可用的 auto_increment 范围在剧烈搅动的桌子上)。

为了更快的速度,在插入之前使用像幽灵哈希这样的小哈希,并将其用于单独的唯一键列,然后 varchar 根本不会被索引。

于 2015-02-03T22:03:39.430 回答