찾다

 >  Q&A  >  본문

MySQL은 다른 열이 비어 있는 경우에만 고유 인덱스를 제한합니다.

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粉930448030P粉930448030345일 전495

모든 응답(2)나는 대답할 것이다

  • P粉463291248

    P粉4632912482024-01-17 09:12:31

    계산된 열을 사용하면 다음을 수행할 수 있습니다.

    으아악

    색인 포함:

    으아악

    P.S. ANSI_QUOTES를 사용하지 않았습니다.

    참조: DBFIDDLE

    회신하다
    0
  • P粉311563823

    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로 지정합니다.

    회신하다
    0
  • 취소회신하다