Bisakah saya menambahkan batasan UNIQUE ke tabel PostgreSQL, setelah itu sudah dibuat?

185

Saya memiliki tabel berikut:

 tickername | tickerbbname  | tickertype
------------+---------------+------------
 USDZAR     | USDZAR Curncy | C
 EURCZK     | EURCZK Curncy | C
 EURPLN     | EURPLN Curncy | C
 USDBRL     | USDBRL Curncy | C
 USDTRY     | USDTRY Curncy | C
 EURHUF     | EURHUF Curncy | C
 USDRUB     | USDRUB Curncy | C

Saya tidak ingin ada yang pernah lebih dari satu kolom untuk setiap diberikan tickername/ tickerbbnamepasangan. Saya sudah membuat tabel dan memiliki banyak data di dalamnya (yang telah saya pastikan memenuhi kriteria unik). Karena semakin besar, ruang untuk kesalahan merayap masuk

Apakah ada cara untuk menambahkan UNIQUEbatasan pada saat ini?

Thomas Browne
sumber

Jawaban:

363

psqlBantuan sebaris:

\h ALTER TABLE

Juga didokumentasikan dalam dokumen postgres (sumber yang bagus, ditambah juga mudah dibaca).

ALTER TABLE tablename ADD CONSTRAINT constraintname UNIQUE (columns);
hhaamu
sumber
6
terima kasih @hhaamu. Yap memang mencoba dokumen tetapi di atas Anda jauh lebih ringkas.
Thomas Browne
117
Jika Anda ingin PostgreSQL menghasilkan nama indeks, gunakan ALTER TABLE tablename ADD UNIQUE (columns);. (Perhatikan bahwa CONSTRAINTkata kunci harus dihilangkan.)
jpmc26
5
Saya membutuhkan jawaban untuk pertanyaan ini dan mulai mencari Google untuk dokumen. Alih-alih dokumentasi Postgres, saya mengalami topik ini di StackOverflow. Jadi meskipun itu adalah pemikiran yang baik untuk merujuk dokumen resmi, juga sangat baik untuk memberikan jawaban untuk kunjungan di masa depan. Terima kasih untuk itu.
Leonard
@ jpmc26 «Jika Anda ingin PostgreSQL menghasilkan nama indeks» Maksud Anda nama kendala?
tuxayo
4
@uxux, kendala-unik diimplementasikan melalui indeks di Postgres (tidak boleh pedantic).
Chris W.
36

Ya kamu bisa. Tetapi jika Anda memiliki entri yang tidak unik di meja Anda, itu akan gagal. Berikut adalah cara menambahkan batasan unik di meja Anda. Jika Anda menggunakan PostgreSQL 9.x Anda dapat mengikuti instruksi di bawah ini.

CREATE UNIQUE INDEX constraint_name ON table_name (columns);
Zeck
sumber
3
Terima kasih Zeck - jawaban 2th yang bagus tapi tetap menghargai bahwa orang-orang masih meluangkan waktu! Tom
Thomas Browne
1
Itu tidak benar. Dalam Postgres terbaru ini juga mengarah ke pesan seperti "Kunci (uuid) = (3a533772-07ac-4e76-b577-27a3878e2222) digandakan. Permintaan gagal" jika Anda memiliki nilai yang tidak unik ...
Strinder
3
@ Strinder, bagaimana itu bukan hal yang baik? perbaiki data yang digandakan terlebih dahulu.
Jasen
3
@ Yasen Itu benar-benar jelas. Hanya ingin menekankan bahwa jawaban "Tetapi jika Anda memiliki entri non-unik di meja Anda. Berikut adalah cara menambahkan kendala unik di meja Anda." tidak akan berfungsi. Entri yang tidak unik tentunya harus selalu dikonsolidasikan sebelumnya.
Strinder
Mengedit jawaban untuk kejelasan
Xavier Ho
6

Jika Anda memiliki tabel yang sudah memiliki kendala yang ada berdasarkan katakanlah: nama dan nama belakang dan Anda ingin menambahkan satu kendala lagi yang unik, Anda harus menghapus seluruh batasan dengan:

ALTER TABLE your_table DROP CONSTRAINT constraint_name;

Pastikan bahwa kendala baru yang ingin Anda tambahkan adalah unik / bukan nol (jika Microsoft Sql, itu hanya dapat berisi satu nilai nol) di semua data pada tabel itu, dan kemudian Anda dapat membuatnya kembali.

ALTER TABLE table_name
ADD CONSTRAINT constraint_name UNIQUE (column1, column2, ... column_n);
Lucas Campos
sumber
5

Ya, Anda dapat menambahkan batasan UNIK setelah faktanya. Namun, jika Anda memiliki entri yang tidak unik di tabel Anda, Postgres akan mengeluh tentang hal itu sampai Anda memperbaikinya.

Jordan S. Jones
sumber
7
select <column> from <table> group by 1 having count(*) > 1;akan memberikan laporan tentang nilai duplikat.
Jasen