我正在尝试重写 Postgres 架构以适应 MySQL (8.0.32) 方言。如您所知,MySQL 不支持部分索引。
在以下情况下,仅当 deleted_at
为 null 时,才会存在一个索引,该索引会强制执行 customer_group.name
上的唯一数据。
这是有道理的,因为确保删除的条目是唯一的是没有意义的。但是,我不明白如何在没有部分索引的情况下实现相同的约束。
CREATE TABLE "customer_group" ( "id" integer NOT NULL AUTO_INCREMENT, "created_at" datetime NOT NULL DEFAULT NOW(), "updated_at" datetime NOT NULL DEFAULT NOW(), "deleted_at" datetime, "name" text NOT NULL, "metadata" text, CONSTRAINT "PK_142c3338-da81-4d0c-8cd8-490bb41cd187" PRIMARY KEY ("id") ); -- solve this -- ensure name is unique when one customer_group is not deleted CREATE UNIQUE INDEX "IDX_d12ecf48-302c-4292-8c8d-d2cc7c8149f9" ON "customer_group" ("name") WHERE "deleted_at" IS NULL;
附注我确实在使用 ANSI_QUOTES
。
有人建议我尝试使用 2 列而不是一列的唯一索引。但是,如果约束是 UNIQUE INDEX "IDX_d12ecf48-302c-4292-8c8d-d2cc7c8149f9" ON "customer_group" ("name", "deleted_at")
那么我会得到与我想要的相反的结果: deleted_at
为 NULL,则 name
可以重复。