Bagaimana Anda menjatuhkan batasan pemeriksaan yang tidak disebutkan namanya dalam tabel PostgresQL?

9

Saya membuat tabel PostgresQL tetapi saya menambahkan batasan cek tanpa nama pada salah satu kolom:

CREATE TABLE FOO
(
id serial primary key,
price_range smallint CHECK (price_range > 0),
url varchar(255)
);

Sekarang saya ingin menghapus batasan ini tetapi saya tidak tahu caranya. ALTER TABLE yang khas ... DROP CONSTRAINT ... perlu a constraint_nametetapi saya tidak memilikinya.

Saya tahu ada jawaban di sini tetapi ketika saya mencoba menentukan nama batasan cek saya dengan mengikuti jawabannya di sana:

SELECT *
FROM information_schema.constraint_table_usage
WHERE table_name = 'your_table'

Semua yang saya dapatkan adalah kendala tunggal yang constraint_nameentrinya foo pkeymengacu pada batasan kunci primer dan bukan cek saya pada pricekolom. Jadi jawaban itu tidak membantu saya, kecuali saya kehilangan sesuatu.

Bagaimana saya bisa menghilangkan batasan ini tanpa kehilangan data?

Terima kasih!

kilgoretrout
sumber

Jawaban:

10

Batasan memiliki nama, apakah Anda menentukannya atau tidak.

Dari psql, \d fooakan mencantumkan semua batasan tabel, bersama dengan nama yang ditetapkan secara otomatis.

Anda juga dapat menemukan ini dengan menanyakan tabel katalog secara langsung:

SELECT conname
FROM pg_constraint
WHERE
  conrelid = 'foo'::regclass AND
  contype = 'c'

Nama tabel dapat memenuhi syarat skema jika perlu (misalnya 'public.foo'::regclass).

contype = 'c'menyaringnya hingga CHECKkendala; yang contypenilai untuk jenis kendala lainnya didokumentasikan di sini .

Nick Barnes
sumber