ALTER TABLE 中的 DROP/ADD UNIQUE 约束是原子的吗?

Ale*_*Guz 5 mysql index alter-table unique-constraint

我有UNIQUE一个表上的多个字段的约束。我想更改此约束中的字段(删除一个字段)的图像。通常我会做这样的事情:

DROP INDEX unique_name ON table_name;
CREATE UNIQUE INDEX unique_name ON table_name (field1, field2, ...);
Run Code Online (Sandbox Code Playgroud)

但这是两个语句,在执行第一个语句后将UNIQUE不再有约束,因此任何INSERT可能都可能破坏约束,直到新的UNIQUE创建的。

还有另一种方法可以做到这一点:

ALTER TABLE table_name
DROP INDEX unique_name, 
ADD CONSTRAINT unique_name UNIQUE (field1, field2, ...);
Run Code Online (Sandbox Code Playgroud)

这是一种说法。问题是:这个语句会执行原子操作吗?我所说的原子是指完全没有约束的时候就没有时间窗口UNIQUE

ype*_*eᵀᴹ 6

根据官方ALTER TABLE文档,这样的操作应该没有问题,而且在UNIQUE完全没有约束的情况下是不会出现窗口的。参见(强调我的):

存储、性能和并发注意事项

在大多数情况下,ALTER TABLE 会生成原始表的临时副本。MySQL 等待正在修改表的其他操作,然后继续。它将更改合并到副本中,删除原始表,然后重命名新表。在执行时ALTER TABLE,原始表可以被其他会话读取(稍后指出的例外情况)。操作开始后开始的更新和写入将被停止,直到新表准备就绪,然后自动重定向到新表,而不会出现任何失败的更新。创建原始表的临时副本...ALTER TABLE


当然,没有什么可以禁止您分两步进行操作(但这可能会降低效率)。

这允许一个小窗口,您将同时拥有这两种约束,但同样没有时间它们都不存在。