Saya sudah mencoba yang berikut ini, tetapi saya tidak berhasil:
ALTER TABLE person ALTER COLUMN dob POSITION 37;
Saya sudah mencoba yang berikut ini, tetapi saya tidak berhasil:
ALTER TABLE person ALTER COLUMN dob POSITION 37;
Jawaban:
" Ubah posisi kolom " di Wiki PostgreSQL mengatakan:
PostgreSQL saat ini mendefinisikan urutan kolom berdasarkan
attnum
kolompg_attribute
tabel. Satu-satunya cara untuk mengubah urutan kolom adalah dengan membuat ulang tabel, atau dengan menambahkan kolom dan memutar data hingga Anda mencapai tata letak yang diinginkan.
Itu cukup lemah, tetapi dalam pertahanan mereka, dalam SQL standar, tidak ada solusi untuk memposisikan ulang kolom juga. Merek database yang mendukung perubahan posisi ordinal kolom mendefinisikan ekstensi ke sintaks SQL.
Satu gagasan lain muncul pada saya: Anda dapat menentukan a VIEW
yang menentukan urutan kolom sesuka Anda, tanpa mengubah posisi fisik kolom di tabel dasar.
Di PostgreSQL, sambil menambahkan bidang, itu akan ditambahkan di akhir tabel. Jika kita perlu memasukkan ke posisi tertentu maka
alter table tablename rename to oldtable;
create table tablename (column defs go here);
insert into tablename (col1, col2, col3) select col1, col2, col3 from oldtable;
Posting ini sudah lama dan mungkin sudah terpecahkan tetapi saya memiliki masalah yang sama. Saya menyelesaikannya dengan membuat tampilan tabel asli yang menentukan urutan kolom baru.
Dari sini saya bisa menggunakan view atau membuat tabel baru dari view.
BUAT TAMPILAN original_tab_vw AS PILIH a.col1, a.col3, a.col4, a.col2 DARI original_tab a DI MANA a.col1 TIDAK NIHIL —atau apalah
PILIH * KE new_table DARI original_tab_vw
Ubah nama atau jatuhkan tabel asli dan atur nama tabel baru ke tabel lama.
Satu, meskipun merupakan opsi yang canggung untuk mengatur ulang kolom ketika urutan kolom harus benar-benar diubah, dan kunci asing digunakan, pertama-tama membuang seluruh database dengan data, lalu membuang hanya schema ( pg_dump -s databasename > databasename_schema.sql
). Selanjutnya edit file skema untuk mengatur ulang kolom seperti yang Anda inginkan, lalu buat ulang database dari skema, dan terakhir pulihkan data ke database yang baru dibuat.
Saya rasa Anda tidak bisa saat ini: lihat artikel ini di wiki Postgresql .
Tiga solusi dari artikel ini adalah:
Buka tabel di PGAdmin dan di panel SQL di bagian bawah salin pernyataan SQL Create Table. Kemudian buka Alat Kueri dan tempel. Jika tabel memiliki data, ubah nama tabel menjadi 'new_name', jika tidak, hapus komentar "-" di baris Drop Table. Edit urutan kolom sesuai kebutuhan. Perhatikan koma yang hilang / berlebihan di kolom terakhir jika Anda telah memindahkannya. Jalankan perintah SQL Create Table baru. Segarkan dan ... voila.
Untuk tabel kosong pada tahap desain cara ini cukup praktis.
Jika tabel memiliki data, kita perlu mengatur ulang urutan kolom datanya juga. Ini mudah: gunakan INSERT
untuk mengimpor tabel lama ke versi barunya dengan:
INSERT INTO new ( c2, c3, c1 ) SELECT * from old;
... di mana c2
, c3
, c1
adalah kolom c1
, c2
, c3
dari meja tua di posisi baru mereka. Harap dicatat bahwa dalam hal ini Anda harus menggunakan nama 'baru' untuk tabel 'lama' yang telah diedit, atau Anda akan kehilangan data Anda . Jika nama kolomnya banyak, panjang dan / atau kompleks, gunakan metode yang sama seperti di atas untuk menyalin struktur tabel baru ke editor teks, dan buat daftar kolom baru di sana sebelum menyalinnya ke dalam INSERT
pernyataan.
Setelah memeriksa bahwa semuanya baik-baik saja, DROP
tabel lama dan ubah nama 'baru' menjadi 'lama' menggunakan ALTER TABLE new RENAME TO old;
dan Anda selesai.
Saya sedang mengerjakan pemesanan ulang banyak tabel dan tidak ingin menulis kueri yang sama berulang kali, jadi saya membuat skrip untuk melakukan semuanya untuk saya. Intinya, ini:
pg_dump
pg_dump
kueri asli untuk membuat tabel yang diurutkan ulang dengan dataIni dapat digunakan dengan menjalankan perintah sederhana berikut:
./reorder.py -n schema -d database table \
first_col second_col ... penultimate_col ultimate_col --migrate
Ini mencetak sql sehingga Anda dapat memverifikasi dan mengujinya, itulah alasan utama saya mendasarkannya pg_dump
. Anda dapat menemukan repo github di sini .
Saya menggunakan Django dan membutuhkan kolom id di setiap tabel jika anda tidak ingin pusing. Sayangnya, saya ceroboh dan tabel saya bp.geo_location_vague tidak berisi bidang ini. Saya memulai trik kecil. Langkah 1:
CREATE VIEW bp.geo_location_vague_vw AS
SELECT
a.id, -- I change order of id column here.
a.in_date,
etc
FROM bp.geo_location_vague a
Langkah 2: (tanpa membuat tabel - tabel akan dibuat secara otomatis!)
SELECT * into bp.geo_location_vague_cp2 FROM bp.geo_location_vague_vw
Langkah 3:
CREATE SEQUENCE bp.tbl_tbl_id_seq;
ALTER TABLE bp.geo_location_vague_cp2 ALTER COLUMN id SET DEFAULT nextval('tbl_tbl_id_seq');
ALTER SEQUENCE bp.tbl_tbl_id_seq OWNED BY bp.geo_location_vague_cp2.id;
SELECT setval('tbl_tbl_id_seq', COALESCE(max(id), 0)) FROM bp.geo_location_vague_cp2;
Karena saya perlu memiliki pseudotype seri besar di tabel. Setelah SELECT * menjadi pg akan membuat tipe bigint insetad bigserial.
langkah 4: Sekarang kita dapat melepaskan tampilan, melepaskan tabel sumber dan mengganti nama tabel baru dengan nama lama. Triknya berhasil diakhiri.
Ada beberapa solusi untuk memungkinkannya:
Menciptakan kembali seluruh tabel
Buat kolom baru di dalam tabel saat ini
Buat tampilan