Membuat batasan UNIK dari objek JSON

8

Mari kita ambil beberapa contoh tabel orang, yang hanya memiliki 2 bidang: id dan data (json).

SELECT data FROM peoples ;
{"name": "Adam","pos":"DBA","age":22 }
{"name": "Alice","pos":"Security","age":33 }
{"name": "Bob","pos":"Manager","age":42 }

Saya ingin membuat batasan untuk bidang "pos", itu harus unik. Saya telah mencari di internet tentang kendala JSON tetapi tidak ada hasil.

Bagaimana saya bisa mengatasi masalah ini?

Chenko47
sumber
6
JSON digunakan untuk skema-kurang, data tidak terstruktur. Jika Anda ingin kendala, Anda harus menormalkan data dengan benar.
a_horse_with_no_name
5
'Normalisasi, normalkan, normalkan!' (VI dezso)
dezso

Jawaban:

17

Pertama dan terutama: Saya setuju dengan komentar @a_horse_with_no_name dan @dezso: Anda harus menormalkan data Anda . JSON tidak untuk itu.

Namun, jika beberapa alasan saya tidak dapat mengerti benar-benar membuat ini menjadi keuntungan, itu mungkin:

Buat ekspresi berdasarkanUNIQUE INDEX :

CREATE UNIQUE INDEX people_data_pos_idx ON peoples( (data->>'pos') ) ;

Jika, pada titik ini, Anda mencoba memasukkan potongan data berikut ke dalam tabel Anda (dengan pos - >> yang sudah ada):

INSERT INTO peoples(data)
VALUES
    ('{"name": "Eve", "pos":"DBA", "age":34}') ;

Anda mendapatkan ini sebagai respons:

ERROR: duplicate key value violates unique constraint "people_data_pos_idx"
SQL state: 23505
Detail: Key ((data ->> 'pos'::text))=(DBA) already exists.

CATATAN: Saya berasumsi bahwa data.posakan selalu berupa string. Jika Anda ingin menggeneralisasi, Anda dapat menggunakannya ( (data->'pos') ). Anda akan mengindeks kemudian ekspresi JSON (B) alih-alih teks. Periksa Fungsi dan Operator JSON .

joanolo
sumber