MySQL(8.0.32) 언어에 맞게 Postgres 스키마를 다시 작성하려고 합니다. 아시다시피 MySQL은 부분 인덱스를 지원하지 않습니다.
deleted_at
为 null 时,才会存在一个索引,该索引会强制执行 customer_group.name
가 유일한 데이터인 경우에만 해당됩니다.
삭제된 항목이 고유한지 확인할 필요가 없으므로 이는 의미가 있습니다. 그러나 부분 인덱싱 없이 동일한 제약 조건을 구현하는 방법을 이해할 수 없습니다.
으아악PS 저는 ANSI_QUOTES
를 사용합니다.
어떤 사람이 하나가 아닌 두 개의 열에 고유 인덱스를 사용해 보라고 제안했습니다. 그러나 제약조건이 UNIQUE INDEX "IDX_d12ecf48-302c-4292-8c8d-d2cc7c8149f9" ON "customer_group" ("name", "deleted_at")
那么我会得到与我想要的相反的结果: deleted_at
为 NULL,则 name
이면 반복될 수 있습니다.
P粉4632912482024-01-17 09:12:31
계산된 열을 사용하면 다음을 수행할 수 있습니다.
으아악색인 포함:
으아악P.S. ANSI_QUOTES를 사용하지 않았습니다.
참조: DBFIDDLE
P粉3115638232024-01-17 00:54:29
MySQL은 부분 인덱스를 지원하지 않지만 표현식 인덱스는 지원합니다(MySQL 8.0부터). 데모는 다음과 같습니다.
으아악UNIQUE는 ANSI의 NULL 규칙을 따르므로 고유 인덱스의 두 번째 열이 NULL인 경우 첫 번째 열에 중복 항목이 얼마든지 있을 수 있습니다. NULL인 두 번째 열은 다른 행과 동일하지 않으므로 항상 "고유"합니다.
따라서 두 번째 열이 "deleted_at"가 NULL일 때만 고정된 NULL이 아닌 값인 경우 "deleted_at"가 NULL인 모든 행에서 "name"은 고유합니다.
으아악MySQL에서는 TEXT 열에 인덱스를 생성할 수 없고 인덱스의 3072바이트 제한에 비해 너무 길기 때문에 "이름" 유형을 변경해야 했습니다.
또한 PRIMARY KEY를 변경하여 제약 조건 이름을 생략했습니다. MySQL은 항상 기본 키의 이름을 간단하게 PRIMARY
로 지정합니다.