Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Tetapkan batasan unik hanya ketika bidang adalah nol

MySQL mendukung fungsional bagian penting sejak 8.0.13 .

  • Jika versi Anda cukup baru, Anda dapat menentukan indeks sebagai:

    UNIQUE(`user_id`, `test_id`, (IFNULL(`completed_date`, -1)))
    

    (Demo di dbfiddle.uk )

    Perhatikan bahwa indeks di atas juga akan mencegah tanggal duplikat untuk eksekusi yang telah selesai. Jika itu harus valid maka indeks yang sedikit dimodifikasi akan berfungsi:

    UNIQUE(`user_id`, `test_id`, (
        CASE WHEN `completed_date` IS NOT NULL
        THEN NULL
        ELSE 0
    END))
    

    (Demo di dbfiddle.uk )

    Meskipun kemudian mulai terasa agak kotor;)

  • Jika Anda memiliki setidaknya versi 5.7 anda dapat menggunakan (virtual) kolom yang dihasilkan sebagai solusinya:

    CREATE TABLE `executed_tests` (
        `id` INTEGER AUTO_INCREMENT NOT NULL,
        `user_id` INTEGER NOT NULL,
        `test_id` INTEGER NOT NULL,
        `start_date` DATE NOT NULL,
        `completed_date` DATE,
        `_helper` CHAR(11) AS (IFNULL(`completed_date`, -1)),
        PRIMARY KEY (`id`),
        UNIQUE(`user_id`, `test_id`, `_helper`)
    );
    

    (Demo di dbfiddle.uk )

  • Jika Anda terjebak pada 5.6 kemudian kombinasi kolom biasa (non-virtual) dan INSERT . yang sedikit dimodifikasi pernyataan akan berhasil:

    CREATE TABLE `executed_tests` (
        `id` INTEGER AUTO_INCREMENT NOT NULL,
        `user_id` INTEGER NOT NULL,
        `test_id` INTEGER NOT NULL,
        `start_date` DATE NOT NULL,
        `completed_date` DATE,
        `is_open` BOOLEAN,
        PRIMARY KEY (`id`),
        UNIQUE(`user_id`, `test_id`, `is_open`)
    );
    

    Dalam hal ini Anda akan mengatur is_open untuk true untuk eksekusi yang tidak lengkap dan untuk NULL setelah selesai, manfaatkan fakta bahwa dua NULL s diperlakukan tidak sama.

    (Demo di dbfiddle.uk )




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kolom Jumlah MySQL JIKA ID ada di kueri tabel lain

  2. MySQL Jumlahkan beberapa nilai kolom dengan ketentuan

  3. Laravel fasih mendapatkan nilai paling umum di kolom database

  4. Bagaimana Anda menghentikan MySQL pada instalasi Mac OS?

  5. Fungsi ORDER BY RAND() membutuhkan waktu lama untuk dieksekusi di mysql