Bagaimana cara menghapus nilai jenis enum yang saya buat di postgresql?
create type admin_level1 as enum('classifier', 'moderator', 'god');
Misalnya saya ingin menghapus moderator
dari daftar.
Sepertinya saya tidak dapat menemukan apa pun di dokumen.
Saya menggunakan Postgresql 9.3.4.
postgresql
enums
Amjith
sumber
sumber
drop type admin_level1
?create xxx
adadrop xxx
Jawaban:
Anda menghapus (menjatuhkan) jenis enum seperti jenis lainnya, dengan
DROP TYPE
:Apakah mungkin Anda benar-benar bertanya tentang cara menghapus nilai individual dari jenis enum ? Jika demikian, Anda tidak bisa. Itu tidak didukung :
Anda harus membuat tipe baru tanpa nilai, mengonversi semua penggunaan yang ada dari tipe lama untuk menggunakan tipe baru, lalu membuang tipe lama.
Misalnya
sumber
(psycopg2.InternalError) ALTER TYPE ... ADD cannot run inside a transaction block
Ditulis dengan sangat baik di sini:
http://blog.yo1.dog/updating-enum-values-in-postgresql-the-safe-and-easy-way/
ganti nama tipe yang ada
buat tipe baru
perbarui kolom untuk menggunakan tipe baru
hapus tipe lama
sumber
Jika Anda ingin menghapus item dengan tipe enum, Anda harus beroperasi pada tabel sistem PostgreSQL.
Dengan perintah ini, Anda dapat menampilkan semua item jenis enum.
PILIH * DARI pg_enum;
Kemudian periksa apakah nilai yang dicari itu unik. Untuk meningkatkan keunikan selama penghapusan recordu harus melewati 'enumtypid' selain 'enumlabel'.
Perintah ini menghapus entri dalam tipe enum, di mana 'unik' adalah nilai Anda.
HAPUS DARI pg_enum id DI MANA en.enumtypid = 124 DAN en.enumlabel = 'unique';
CATATAN Contoh yang saya jelaskan harus digunakan, ketika secara kebetulan kami menambahkan nilai baru ke tipe enum, namun kami belum menggunakannya di mana pun dalam database.
sumber
ERROR: invalid internal value for enum
dan menghasilkan NO hasil.)DELETE FROM pg_enum en WHERE en.enumtypid=124 AND en.enumlabel='unigue';
CATATAN harus dalam BOLD, bukan perintah. Jika Anda telah menggunakan nilai di beberapa tabel, Anda tidak dapat memulihkannya. Anda tidak dapat memperbarui baris yang berisi nilai, Anda tidak dapat mengonversi. Satu-satunya cara adalah menghapus seluruh baris.Bagi mereka yang ingin mengubah nilai enum, membuat ulang tampaknya menjadi satu-satunya solusi yang layak dan aman.
Ini terdiri dari konversi sementara kolom enum ke format string, membuat ulang enum dan kemudian mengubah kolom string kembali ke tipe enum.
Berikut ini contohnya:
sumber
ALTER TABLE your_schema.your_table ALTER COLUMN your_column TYPE your_schema.your_enum_name USING your_enum_name::your_schema.your_column;
harusALTER TABLE your_schema.your_table ALTER COLUMN your_column TYPE your_schema.your_enum_name USING your_schema.your_column::your_enum_name;
Gunakan query berikut untuk menghapus nilai ENUM dari tipe Postgresql
Sekadar info untuk apa tipe dan apa nilainya
Anda harus mengubah nilai yang ada ke yang lain. Untuk itu jika perlu menambahkan nilai baru, maka gunakan:
Sebelum menghapus, perbarui nilai tipe ke nilai tipe baru atau nilai yang sudah ada.
sumber
SELECT oid FROM pg_type WHERE typname = 'enum_type'
Cara terprogram untuk melakukannya adalah sebagai berikut. Langkah-langkah umum yang sama seperti yang diberikan di https://stackoverflow.com/a/47305844/629272 sesuai, tetapi itu lebih manual daripada yang masuk akal untuk tujuan saya (menulis migrasi alembic ke bawah).
my_type
,,my_type_old
danvalue_to_delete
, tentu saja, harus diubah sebagaimana mestinya.Ubah nama tipe Anda.
Buat tipe baru dengan nilai dari tipe lama Anda, tidak termasuk yang ingin Anda hapus.
Ubah semua kolom yang ada yang menggunakan tipe lama untuk menggunakan yang baru.
Hapus tipe lama.
sumber
Jika kumpulan data Anda tidak terlalu besar, Anda dapat membuangnya dengan
--column-inserts
mengedit dump dengan editor teks, hapus nilainya dan impor kembali dumpsumber
Punya masalah yang sama di v.10. postgres. Penghapusan memerlukan prosedur tertentu, dan jika urutannya tidak benar, maka ada kemungkinan tabel dikunci untuk dibaca.
Menulis skrip yang mudah dihapus. Sudah beberapa kali terbukti performanya. Namun, prosedur ini melibatkan penggantian nilai yang dihapus dengan yang baru (bisa NULL jika bidang tabel memungkinkan ini).
Untuk menggunakannya, Anda hanya perlu mengisi 3 nilai.
sumber
Tidak mungkin menghapus nilai individu dari ENUM, satu-satunya solusi yang mungkin adalah DROP dan membuat ulang ENUM dengan nilai yang diperlukan.
sumber
DELETE FROM pg_enum WHERE enumlabel='saml' AND enumsortorder=4;