Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Menguatkuasakan Kekangan Unik dengan Lajur Boleh Null dalam Jadual Pangkalan Data?

Bagaimana untuk Menguatkuasakan Kekangan Unik dengan Lajur Boleh Null dalam Jadual Pangkalan Data?

Barbara Streisand
Barbara Streisandasal
2025-01-20 23:56:13184semak imbas

How to Enforce Unique Constraints with Nullable Columns in a Database Table?

Kuatkuasakan kekangan unik dalam jadual yang mengandungi lajur boleh batal

Artikel ini membincangkan cabaran mencipta kekangan unik pada jadual yang mengandungi lajur boleh batal. Matlamatnya adalah untuk menghalang berbilang baris daripada mempunyai gabungan nilai yang sama, walaupun lajur yang boleh dibatalkan adalah batal.

Soalan:

Skema jadual yang disediakan mempunyai lajur UserRepository yang boleh dibatalkan. Walau bagaimanapun, pengguna ingin memastikan bahawa untuk setiap pasangan UserId dan RecipeId, hanya satu baris wujud, tanpa mengira nilai MenuId.

Jawapan:

PostgreSQL 15 atau lebih tinggi:

  • Gunakan klausa NULLS NOT DISTINCT dalam definisi kekangan UNIK.
<code class="language-sql">ALTER TABLE Favorites
ADD CONSTRAINT Favorites_UniqueFavorite UNIQUE NULLS NOT DISTINCT (UserId, MenuId, RecipeId);</code>

PostgreSQL 14 atau lebih rendah:

  • Buat dua indeks separa:
<code class="language-sql">CREATE UNIQUE INDEX favo_3col_uni_idx ON Favorites (UserId, MenuId, RecipeId)
WHERE MenuId IS NOT NULL;

CREATE UNIQUE INDEX favo_2col_uni_idx ON Favorites (UserId, RecipeId)
WHERE MenuId IS NULL;</code>

Kelebihan:

  • Menguatkuasakan kekangan yang diperlukan dengan cekap.

Kelemahan (indeks separa sahaja):

  • Hadkan rujukan kunci asing dan pilihan pengelompokan.
  • Dalam beberapa pertanyaan, ia tidak akan berfungsi jika tiada keadaan WHERE yang sepadan.

Alternatif:

  • Jika berbilang lajur boleh batal terlibat, sila rujuk perbincangan dalam artikel ini: "Mengapa kekangan UNIK saya tidak menyala?".

Atas ialah kandungan terperinci Bagaimana untuk Menguatkuasakan Kekangan Unik dengan Lajur Boleh Null dalam Jadual Pangkalan Data?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn