Akses skema php Postgresql. Fungsi PostgreSQL. Menukar jenis medan dengan selamat

Fungsi PostgreSQL

Postgres, yang pada asalnya dibangunkan oleh Jabatan Sains Komputer UC Berkeley, mempelopori banyak konsep berorientasikan objek yang kini tersedia dalam beberapa pangkalan data komersial. Ia menyediakan sokongan untuk bahasa SQL92/SQL99, integriti transaksi dan kebolehlanjutan jenis. PostgreSQL ialah turunan sumber terbuka kod Berkeley asal.

Pangkalan data PostgreSQL membuka produk Sumber tersedia secara percuma. Untuk menggunakan sokongan PostgreSQL, anda memerlukan PostgreSQL 6.5 atau lebih baru. PostgreSQL 7.0 atau lebih baru - untuk semua ciri modul PostgreSQL. PostgreSQL menyokong banyak pengekodan aksara, termasuk pengekodan aksara berbilangbait. Versi semasa dan maklumat tentang PostgreSQL boleh didapati di http://www.postgresql.org/.

Untuk mendayakan sokongan PostgreSQL, pilihan --with-pgsql[=DIR] diperlukan semasa menyusun PHP. Jika modul objek kongsi tersedia, modul PostgreSQL boleh dimuatkan menggunakan arahan sambungan dalam fail php.ini atau fungsi dl(). Arahan ini yang disokong diterangkan dalam fail php.ini-dist yang dibekalkan dengan kod sumber pengedaran.


Amaran!

Nama fungsi PostgreSQL akan ditukar dalam keluaran 4.2.0 untuk memastikan pematuhan dengan piawaian pengekodan sedia ada. Kebanyakan nama baharu akan mempunyai garis bawah tambahan, contohnya pg_lo_open(). Sesetengah fungsi dinamakan semula untuk konsistensi. contohnya pg_exec() dalam pg_query(). Nama lama boleh digunakan dalam keluaran 4.2.0 dan beberapa keluaran 4.2.0, tetapi ia mungkin dialih keluar pada masa hadapan.

Jadual 1. Perubahan nama fungsi
nama lama Nama baru
pg_exec() pg_query()
pg_getlastoid() pg_last_oid()
pg_cmdtuples() pg_affected_rows()
pg_numrows() pg_num_rows()
pg_numfields() pg_num_fields()
pg_fieldname() pg_field_name()
pg_fieldsize() pg_field_size()
pg_fieldnum() pg_field_num()
pg_fieldprtlen() pg_field_prtlen()
pg_fieldisnull() pg_field_is_null()
pg_freeresult() pg_free_result()
pg_result() pg_fetch_result()
pg_loreadall() pg_lo_read_all()
pg_locreate() pg_lo_create()
pg_lounlink() pg_lo_unlink()
pg_loopen() pg_lo_open()
pg_loclose() pg_lo_close()
pg_loread() pg_lo_read()
pg_lowrite() pg_lo_write()
pg_loimport() pg_lo_import()
pg_loexport() pg_lo_export()

Tidak semua ciri disokong dalam semua binaan. Ini bergantung pada versi libpq anda (Antara muka Klien PostgreSQL C) dan cara libpq disusun. Jika terdapat fungsi yang hilang, libpq tidak menyokong keupayaan yang diperlukan oleh fungsi tersebut.

Ia juga penting untuk anda menggunakan libpq yang lebih baharu daripada Pelayan PostgreSQL yang anda sambungkan. Jika anda menggunakan libpq yang lebih lama daripada jangkaan Pelayan PostgreSQL, anda akan menghadapi masalah.

Sejak versi 6.3 (02/03/1998), PostgreSQL menggunakan soket domain unix secara lalai. Port TCP TIDAK dibuka secara lalai. Jadual menerangkan pilihan sambungan baharu ini. Soket ini boleh didapati dalam /tmp/.s.PGSQL.5432. Pilihan ini boleh didayakan dengan bendera "-i" untuk guru pos, dan nilainya ialah: "mendengar soket TCP/IP serta soket domain Unix."

Jadual 2. Postmaster dan PHP

Sambungan ke pelayan PostgreSQL boleh diwujudkan dengan pasangan nilai berikut pada baris arahan: $conn = pg_connect("host=myHost port=myPort tty=myTTY options=myOptions dbname=myDB user=myUser password=myPassword ");

Sintaks sebelumnya: $conn = pg_connect("host", "port", "options", "tty", "dbname") tidak disyorkan lagi.

Pembolehubah persekitaran mempengaruhi tingkah laku pelayan/pelanggan PostgreSQL. Sebagai contoh, model PostgreSQL akan mencari pembolehubah persekitaran PGHOST jika nama hos tiada dalam rentetan sambungan. Pembolehubah persekitaran yang disokong berbeza antara versi. Lihat Manual Pengaturcara PostgreSQL (libpq - Pembolehubah Persekitaran) untuk butiran.

Pastikan anda menetapkan pembolehubah persekitaran untuk pengguna yang sesuai. Gunakan $_ENV atau getenv() untuk menyemak pembolehubah persekitaran yang tersedia untuk proses semasa.

Bermula dengan PostgreSQL 7.1.0, anda boleh menyimpan 1GB dalam medan teks. Versi lama mungkin mempunyai sekatan saiz blok (lalai ialah 8KB, maksimum ialah 32KB, ditentukan pada masa penyusunan).

Untuk menggunakan antara muka objek besar (lo), anda mesti memasukkan fungsi lo di dalam blok transaksi. Blok transaksi bermula dengan pernyataan SQL BERMULA, dan jika transaksi itu betul, tamat KOMITED atau TAMAT. Jika transaksi gagal, ia mesti ditutup dengan KEMBALIKAN atau GUGURKAN.

Anda tidak seharusnya menutup sambungan ke pelayan PostgreSQL sebelum menutup objek besar.

Kandungan

pg_affected_rows - mengembalikan bilangan baris yang terjejas (pasangan/tuples) pg_cancel_query - membatalkan pertanyaan async pg_client_encoding - mendapatkan pengekodan klien pg_close - menutup sambungan PostgreSQL pg_connect - membuka sambungan PostgreSQL pg_connection_busy sama ada sambungan itu ditutup atau disambung semula ) pg_connection_status - mendapat status sambungan pg_convert - menukar nilai tatasusunan bersekutu kepada nilai yang sesuai untuk pernyataan SQL pg_copy_from - memasukkan rekod ke dalam jadual daripada tatasusunan pg_copy_to - menyalin jadual ke dalam tatasusunan pg_dbname - mendapat nama pangkalan data pg_delete - memadam rekod pg_end_copy - menyegerakkan dengan PostgreSQL backend pg_escape_bytea - mnemonizes/escape binary for type bytea pg_escape_string - mnemonizes string for type text/char pg_execute - Menghantar permintaan untuk melaksanakan arahan siap pakai dengan parameter yang diberikan, dan menunggu parll_fetch untuk keputusannya semua baris dalam lajur tertentu hasil sebagai tatasusunan pg_fetch_all - menghuraikan semua baris daripada hasil sebagai tatasusunan pg_fetch_array - mendapatkan semula baris sebagai tatasusunan pg_fetch_assoc - menghuraikan baris sebagai tatasusunan bersekutu pg_fetch_object - mendapatkan kembali baris sebagai objek pultg_fetch nilai daripada sumber pg_fetch_row yang terhasil - mendapatkan semula baris sebagai tatasusunan yang boleh dikira pg_field_is_null - menyemak sama ada medan itu NULL pg_field_name - mengembalikan nama medan pg_field_num - mengembalikan nombor medan bernama pg_field_prtlen - mengembalikan saiz boleh cetak pg_field_size - mengembalikan saiz storan dalaman medan bernama pg_field_type - mengembalikan nama jenis untuk nombor medan yang sepadan pg_field_type_oid - mengembalikan jenis pengecam (OID) untuk nombor medan yang sepadan pg_free_result - membebaskan memori yang terhasil pg_get_notify - Menerima mesej amaran SQL pg_get_pid - Mendapat ID proses backend pg_get_result - Mendapat hasil permintaan tak segerak pg_host - Mengembalikan nama hos yang dikaitkan dengan sambungan pg_insert tatasusunan ke dalam jadual pg_last_error - Mendapat rentetan mesej ralat sambungan terakhir pg_last_notice - Mengembalikan pemberitahuan terakhir dari PostgreSQL- pelayan pg_last_oid - mengembalikan oid objek terakhir pg_lo_close - menutup objek besar pg_lo_create - mencipta objek besar pg_lo_export - exports besar objek ke fail pg_lo_import - mengimport objek besar dari fail pg_lo_open - membuka objek besar pg_lo_read_all - membaca keseluruhan objek besar dan menghantarnya ke pelayar pg_lo_read - membaca objek besar pg_lo_seek - mencari kedudukan objek besar dan pg_lo_tell - mengembalikan kedudukan semasa objek besar

Perpustakaan Templat Standard ( Perpustakaan Templat Standard , STL) disertakan dalam pustaka standard bahasa C++. Ia termasuk pelaksanaan bekas dan algoritma yang paling biasa digunakan, yang menyelamatkan pengaturcara daripada rutin menulis semula mereka berulang kali. Apabila membangunkan bekas dan algoritma yang digunakan padanya (seperti mengalih keluar elemen yang sama, menyusun, mencari, dll.), sama ada serba boleh atau prestasi sering perlu dikorbankan. Walau bagaimanapun, pemaju STL menetapkan sendiri tugas untuk menjadikan perpustakaan itu cekap dan universal. Untuk menyelesaikan masalah ini, cara sejagat bahasa C++ seperti templat dan beban berlebihan operator telah digunakan. Dalam pembentangan berikut kami akan bergantung pada pelaksanaan STL yang dibekalkan oleh Microsoft bersama-sama dengan pengkompil Visual C++ 6.0. Walau bagaimanapun, kebanyakan perkara di atas juga akan berlaku untuk pelaksanaan STL oleh penyusun lain.

Konsep utama dalam STL ialah konsep bekas (container), algoritma (algoritma) dan iterator (iterator).

bekasialah simpanan objek (kedua-dua jenis terbina dalam dan ditentukan pengguna). Biasanya, bekas dilaksanakan sebagai templat kelas. Jenis bekas yang paling mudah (tatasusunan statik dan dinamik) dibina terus ke dalam bahasa C++. Selain itu, perpustakaan standard termasuk pelaksanaan bekas seperti vektor, senarai, baris gilir, peta, set dan beberapa yang lain.

Algoritmaialah fungsi untuk memanipulasi objek yang terkandung dalam bekas. Contoh biasa algoritma ialah menyusun dan mencari. STL melaksanakan kira-kira 60 algoritma yang boleh digunakan pada pelbagai bekas, termasuk tatasusunan terbina dalam bahasa C++.

Iteratorialah abstraksi penunjuk, iaitu objek yang boleh merujuk kepada objek lain yang terkandung dalam bekas. Fungsi utama iterator adalah untuk menyediakan akses kepada objek yang dirujuknya (merujuk) dan untuk bergerak dari satu elemen kontena ke elemen lain (lelaran, maka dinamakan iterator). Untuk bekas terbina dalam, penunjuk biasa digunakan sebagai lelaran. Dalam kes bekas yang lebih kompleks, iterator dilaksanakan sebagai kelas dengan satu set pengendali terlampau beban.

Sebagai tambahan kepada elemen yang ditanda dalam STL terdapat nombor konsep bantu ; Anda juga harus mengenali sebahagian daripada mereka.

Pengagih(allocator) ialah objek yang bertanggungjawab untuk memperuntukkan memori untuk elemen kontena. Pengalokasi dikaitkan dengan setiap bekas standard (jenisnya diluluskan sebagai salah satu parameter templat). Jika sesetengah algoritma perlu memperuntukkan memori untuk elemen, ia mesti melakukan ini melalui pengalokasi. Dalam kes ini, anda boleh yakin bahawa objek yang diedarkan akan dimusnahkan dengan betul.

STL termasuk kelas pengalokasi standard (diterangkan dalam fail xmemory). Inilah yang digunakan oleh semua bekas yang dilaksanakan dalam STL secara lalai. Walau bagaimanapun, pengguna boleh melaksanakan kelasnya sendiri. Ini sangat jarang diperlukan, tetapi kadangkala boleh dilakukan untuk tujuan kecekapan atau penyahpepijatan.

Mari kita lihat dengan lebih dekat konsep yang diperkenalkan.

Bekas . Setiap bekas menyediakan antara muka yang ditetapkan dengan ketat di mana algoritma akan berinteraksi dengannya. Iterator khusus kontena menyediakan antara muka ini. Adalah penting untuk menekankan bahawa tiada fungsi ahli tambahan digunakan untuk berinteraksi antara algoritma dan bekas. Ini dilakukan kerana algoritma standard mesti berfungsi, termasuk bekas terbina dalam bahasa C++, yang mempunyai iterator (penunjuk) tetapi tidak ada yang lain. Oleh itu, apabila mencipta bekas anda sendiri, melaksanakan iterator adalah minimum.

Setiap bekas melaksanakan jenis iterator tertentu. Ini memilih jenis lelaran yang paling berfungsi yang boleh dilaksanakan dengan berkesan untuk bekas tertentu. "Cekap" bermaksud bahawa kelajuan melaksanakan operasi pada iterator tidak harus bergantung pada bilangan elemen dalam bekas. Sebagai contoh, lelaran akses rawak dilaksanakan untuk vektor, dan lelaran dwiarah dilaksanakan untuk senarai. Oleh kerana kelajuan operasi senarai adalah linear dengan panjangnya, iterator capaian rawak untuk senarai tidak dilaksanakan.

Tidak kira organisasi sebenar bekas (vektor, senarai, pokok), elemen yang disimpan di dalamnya boleh dianggap sebagai urutan. Peulang bagi elemen pertama dalam jujukan ini dikembalikan oleh fungsi begin() dan lelaran bagi elemen yang mengikuti yang terakhir dikembalikan oleh fungsi end(). Ini sangat penting, kerana semua algoritma dalam STL berfungsi dengan tepat dengan jujukan yang ditentukan oleh iterator mula dan akhir.

Sebagai tambahan kepada iterator biasa dalam STL, terdapat iterator terbalik ( lelaran terbalik ). Peulang terbalik adalah berbeza kerana ia melelaran melalui jujukan elemen dalam bekas dalam susunan terbalik. Dalam erti kata lain, operasi + dan - diterbalikkan. Ini membolehkan algoritma digunakan untuk kedua-dua jujukan langsung dan terbalik unsur-unsur. Contohnya, menggunakan fungsi cari, anda boleh mencari elemen dari kedua-dua "permulaan" dan "akhir" bekas.

Dalam STL, bekas dibahagikan kepada tiga kumpulan utama (Jadual 2): ​​bekas jujukan, bekas bersekutu dan penyesuai bekas. Dua kumpulan pertama digabungkan ke dalam bekas kelas pertama.

jadual 2

Kelas kontena STL

Penerangan

Bekas urutan

vektor

Tatasusunan dinamik

deque

Barisan dua arah

senarai

Senarai linear dua hala

Bekas Bersekutu

Bekas bersekutu dengan kunci unik

multiset

Bekas bersekutu membenarkan kunci pendua

Bekas bersekutu untuk set elemen unik

peta berbilang

Bekas bersekutu untuk set dengan elemen pendua

Penyesuai bekas

timbunan

Timbunan standard

beratur

Beratur standard

priority_queue

Barisan keutamaan

Setiap kelas kontena dilaksanakan dalam STL , menerangkan set jenis yang dikaitkan dengan bekas. Anda harus mengikuti amalan yang sama ini apabila menulis bekas anda sendiri. Berikut ialah senarai jenis yang paling penting:

value_type - jenis elemen;

saiz_jenis - jenis untuk menyimpan bilangan elemen (biasanya saiz_t);

iterator - iterator untuk elemen kontena;

jenis_kunci - jenis kunci (dalam bekas bersekutu).

Selain jenis, kita boleh membezakan satu set fungsi yang hampir setiap bekas dalam STL melaksanakan (Jadual 3). Mereka tidak diperlukan untuk interaksi dengan algoritma, tetapi pelaksanaannya meningkatkan kebolehtukaran bekas dalam program. STL direka bentuk supaya bekas menyediakan fungsi yang serupa.

Jadual 3

Kaedah biasa semua bekas STL

Penerangan

pembina lalai

Pembina lalai. Biasanya bekas mempunyai beberapa pereka bentuk

pembina salinan

Salin pembina

pemusnah

Pemusnah

kosong

Mengembalikan benar jika tiada unsur dalam bekas, palsu sebaliknya

max_size

Mengembalikan bilangan maksimum elemen untuk bekas

saiz

Mengembalikan bilangan elemen dalam bekas pada masa semasa

pengendali =

Berikan satu bekas kepada bekas yang lain

pengendali<

Mengembalikan benar jika bekas pertama lebih kecil daripada bekas kedua, palsu sebaliknya

pengendali<=

Mengembalikan benar jika bekas pertama tidak lebih besar daripada bekas kedua, sebaliknya palsu

pengendali >

Mengembalikan benar jika bekas pertama lebih besar daripada bekas kedua, palsu sebaliknya

pengendali >=

Mengembalikan benar jika bekas pertama tidak lebih kecil daripada bekas kedua, sebaliknya palsu

pengendali ==

Mengembalikan benar jika bekas yang dibandingkan adalah sama, palsu sebaliknya

pengendali !=

Mengembalikan benar jika bekas yang dibandingkan tidak sama, palsu sebaliknya

bertukar-tukar

Menukar elemen dua bekas

Ciri tersedia hanya dalam bekas kelas pertama

bermula

Dua versi fungsi ini mengembalikan sama ada iterator atau const_iterator, yang merujuk kepada elemen pertama bekas

Dua versi fungsi ini mengembalikan sama ada iterator atau const_iterator, yang merujuk kepada kedudukan seterusnya selepas penghujung bekas

mulakan

Dua versi fungsi ini kembali sama ada reverse_iterator atau reverse_const_iterator , yang merujuk kepada elemen terakhir bekas

koyak

Dua versi fungsi ini mengembalikan sama ada reverse_iterator atau reverse_const_iterator, yang merujuk kepada kedudukan sebelum elemen pertama bekas

masukkan, padam,

Membolehkan anda memasukkan atau mengalih keluar elemen di tengah-tengah jujukan

Jadual akhir 3

jelas

Mengalih keluar semua elemen daripada bekas

depan belakang

push_back, pop_back

Membolehkan anda menambah atau mengalih keluar elemen terakhir dalam urutan

tolak_depan, pop_depan

Membolehkan anda menambah atau mengalih keluar elemen pertama dalam urutan

Iterator biasanya dibuat sebagai rakan kelas yang mereka kendalikan, membenarkan akses terus kepada data peribadi kelas tersebut. Satu bekas boleh mempunyai berbilang iterator yang dikaitkan dengannya, setiap satunya mengekalkan "maklumat kedudukan" sendiri (Jadual 4).

Jadual 4

Jenis iterator

Akses

Penyahrujukan

Lelaran

Perbandingan

Lelaran keluaran

(peulang output)

Rakaman sahaja

Input Iterator

(peulang input)

Hanya membaca

*, ->

==, !=

Peulang ke hadapan

(peulang ke hadapan)

Baca dan tulis

*, ->

==, !=

Peulang dua arah(peulang dua arah)

Baca dan tulis

*, ->

++, --

==, !=

Peulang capaian rawak

(rawak - akses iterator)

Baca dan tulis

*, ->,

++, --, +, -, +=, -=

==, !=, <, <=, >, >=

Terdapat banyak tutorial PostgreSQL di web yang menerangkan arahan asas. Tetapi apabila menyelam lebih dalam ke dalam kerja, isu praktikal timbul yang memerlukan pasukan maju.

Perintah, atau coretan sedemikian, jarang diterangkan dalam dokumentasi. Mari lihat beberapa contoh yang berguna untuk pembangun dan pentadbir pangkalan data.

Mendapatkan maklumat tentang pangkalan data

Saiz pangkalan data

Untuk mendapatkan saiz fizikal fail pangkalan data (storan), kami menggunakan pertanyaan berikut:

PILIH pg_database_size(current_database());

Keputusan akan dibentangkan sebagai nombor dalam borang 41809016.

current_database() ialah fungsi yang mengembalikan nama pangkalan data semasa. Sebaliknya, anda boleh memasukkan nama dalam teks:

PILIH pg_database_size("my_database");

Untuk mendapatkan maklumat dalam bentuk yang boleh dibaca manusia, kami menggunakan fungsi pg_size_pretty:

PILIH pg_size_pretty(pg_database_size(current_database()));

Hasilnya, kami memperoleh maklumat borang 40 Mb.

Senarai jadual

Kadangkala anda perlu mendapatkan senarai jadual pangkalan data. Untuk melakukan ini, kami menggunakan pertanyaan berikut:

PILIH nama_jadual DARI information_schema.tables DI MANA table_schema NOT IN ("information_schema","pg_catalog");

information_schema ialah skema pangkalan data standard yang mengandungi koleksi pandangan seperti jadual, medan, dsb. Paparan jadual mengandungi maklumat tentang semua jadual dalam pangkalan data.

Pertanyaan di bawah akan memilih semua jadual daripada skema pangkalan data semasa yang ditentukan:

PILIH nama_jadual DARI information_schema.tables DI MANA table_schema NOT IN ("information_schema", "pg_catalog") DAN table_schema IN("public", "myschema");

Keadaan IN terakhir boleh digunakan untuk menentukan nama skema tertentu.

Saiz meja

Sama seperti mendapatkan saiz pangkalan data, saiz data jadual boleh dikira menggunakan fungsi yang sesuai:

PILIH pg_relation_size("akaun");

Fungsi pg_relation_size mengembalikan jumlah ruang cakera yang diduduki oleh lapisan tertentu bagi jadual atau indeks tertentu pada cakera.

Nama jadual terbesar

Untuk memaparkan senarai jadual dalam pangkalan data semasa, diisih mengikut saiz jadual, jalankan pertanyaan berikut:

PILIH relname, relpages DARI pg_class ORDER BY relpages DESC;

Untuk memaparkan maklumat tentang jadual terbesar, kami mengehadkan pertanyaan menggunakan LIMIT:

PILIH relname, relpages DARI pg_class ORDER BY relpages DESC LIMIT 1;

relname - nama jadual, indeks, paparan, dsb.
relpages - saiz perwakilan cakera jadual ini dalam bilangan halaman (secara lalai, satu halaman ialah 8 KB).
pg_class ialah jadual sistem yang mengandungi maklumat tentang hubungan antara jadual pangkalan data.

Senarai pengguna yang disambungkan

Untuk mengetahui nama, IP dan port terpakai pengguna yang disambungkan, jalankan pertanyaan berikut:

PILIH datname, usename, client_addr, client_port FROM pg_stat_activity;

Aktiviti pengguna

Untuk mengetahui aktiviti sambungan pengguna tertentu, gunakan pertanyaan berikut:

PILIH nama data DARI pg_stat_activity WHERE usename = "devuser";

Bekerja dengan data dan medan jadual

Mengalih keluar baris pendua

Jika kebetulan jadual itu tidak mempunyai kunci utama, maka mungkin akan terdapat pendua antara rekod. Jika untuk jadual sedemikian, terutamanya yang besar, adalah perlu untuk menetapkan kekangan untuk memeriksa integriti, kemudian alih keluar elemen berikut:

  • baris pendua,
  • situasi di mana satu atau lebih lajur diduakan (jika lajur ini bertujuan untuk digunakan sebagai kunci utama).

Mari kita pertimbangkan jadual dengan data pelanggan, di mana seluruh baris (yang kedua) diduplikasi.

Pertanyaan berikut akan membantu anda mengalih keluar semua pendua:

PADAM DARIPADA pelanggan DI MANA ctid TIDAK MASUK (PILIH maks(ctid) DARI pelanggan KUMPULAN OLEH pelanggan.*);

Medan ctid, unik untuk setiap rekod, disembunyikan secara lalai, tetapi ia terdapat dalam setiap jadual.

Permintaan terakhir adalah intensif sumber, jadi berhati-hati apabila melaksanakannya pada projek pengeluaran.

Sekarang pertimbangkan kes apabila nilai medan diulang.

Jika dibenarkan untuk memadamkan pendua tanpa menyimpan semua data, kami akan melaksanakan permintaan berikut:

PADAM DARIPADA pelanggan DI MANA ctid TIDAK DALAM (PILIH maks(ctid) DARIPADA pelanggan KUMPULAN OLEH customer_id);

Jika data itu penting, maka anda perlu mencari rekod dengan pendua terlebih dahulu:

PILIH * DARI pelanggan DI MANA ctid NOT IN (PILIH maks(ctid) DARI pelanggan KUMPULAN OLEH customer_id);

Sebelum memadam, rekod tersebut boleh dialihkan ke jadual sementara atau nilai customer_id di dalamnya boleh digantikan dengan yang lain.

Bentuk umum permintaan untuk memadam rekod yang diterangkan di atas adalah seperti berikut:

PADAM DARI table_name DI MANA ctid NOT IN (PILIH max(ctid) DARI table_name KUMPULAN MENGIKUT lajur1, );

Menukar jenis medan dengan selamat

Mungkin terdapat soalan tentang memasukkan tugasan sedemikian dalam senarai ini. Lagipun, dalam PostgreSQL sangat mudah untuk menukar jenis medan menggunakan arahan ALTER. Mari kita lihat jadual pelanggan sekali lagi sebagai contoh.

Medan customer_id menggunakan jenis data rentetan varchar. Ini adalah ralat kerana medan ini sepatutnya menyimpan ID pelanggan, yang dalam format integer. Menggunakan varchar tidak wajar. Mari cuba betulkan salah faham ini menggunakan arahan ALTER:

ALTER TABLE pelanggan ALTER COLUMN customer_id TYPE integer;

Tetapi sebagai hasil daripada pelaksanaan kami mendapat ralat:

RALAT: lajur “customer_id” tidak boleh dihantar secara automatik untuk menaip integer
Keadaan SQL: 42804
Petunjuk: Tentukan ungkapan USING untuk melakukan penukaran.

Ini bermakna anda tidak boleh menukar jenis medan jika terdapat data dalam jadual. Memandangkan jenis varchar digunakan, DBMS tidak dapat menentukan sama ada nilai itu adalah integer. Walaupun data sepadan dengan jenis ini. Untuk menjelaskan perkara ini, mesej ralat mencadangkan menggunakan ungkapan USING untuk menukar data kami kepada integer dengan betul:

ALTER TABLE pelanggan ALTER COLUMN customer_id TYPE integer USING (customer_id::integer);

Akibatnya, semuanya berjalan tanpa kesilapan:

Sila ambil perhatian bahawa apabila menggunakan USING, sebagai tambahan kepada ungkapan tertentu, adalah mungkin untuk menggunakan fungsi, medan dan pengendali lain.

Sebagai contoh, mari tukar medan customer_id kembali kepada varchar , tetapi dengan penukaran format data:

ALTER TABLE pelanggan ALTER COLUMN customer_id TYPE varchar USING (customer_id || "-" || first_name);

Akibatnya, jadual akan kelihatan seperti ini:

Mencari nilai "hilang".

Berhati-hati apabila menggunakan jujukan sebagai kunci utama: semasa tugasan, beberapa elemen jujukan secara tidak sengaja dilangkau, dan akibat bekerja dengan jadual, beberapa rekod dipadamkan. Nilai sedemikian boleh digunakan semula, tetapi ia sukar dicari dalam jadual besar.

Mari kita pertimbangkan dua pilihan carian.

Cara pertama
Mari jalankan pertanyaan berikut untuk mencari permulaan selang dengan nilai "hilang":

PILIH id_pelanggan + 1 DARI pelanggan mo WHERE NOT EXISTS (PILIH NULL DARI pelanggan mi WHERE mi.customer_id = mo.customer_id + 1) PESANAN OLEH customer_id;

Hasilnya, kami mendapat nilai berikut: 5, 9 dan 11.

Jika anda perlu mencari bukan sahaja kejadian pertama, tetapi semua nilai yang hilang, kami menggunakan pertanyaan berikut (intensif sumber!):

DENGAN seq_maks AS (PILIH maks(id_pelanggan) DARI pelanggan), seq_min AS (PILIH min(id_pelanggan) DARI pelanggan) PILIH * DARI generate_series((PILIH min DARI seq_min),(PILIH maks DARI seq_maks)) KECUALI PILIH customer_id DARIPADA pelanggan;

Hasilnya, kita melihat hasil berikut: 5, 9 dan 6.

Cara kedua
Kami mendapat nama jujukan yang dikaitkan dengan customer_id:

PILIH pg_get_serial_sequence("customer", "customer_id");

Dan kami dapati semua pengecam yang hilang:

DENGAN sequence_info AS (SELECT start_value, last_value FROM "SchemaName"."SequenceName") PILIH generate_series ((sequence_info.start_value), (sequence_info.last_value)) DARI sequence_info KECUALI PILIH customer_id DARIPADA pelanggan;

Mengira bilangan baris dalam jadual

Bilangan baris dikira oleh fungsi kiraan standard, tetapi ia boleh digunakan dengan syarat tambahan.

Jumlah bilangan baris dalam jadual:

PILIH kiraan(*) DARI jadual;

Bilangan baris dengan syarat medan yang ditentukan tidak mengandungi NULL:

PILIH kiraan(col_name) DARI jadual;

Bilangan baris unik untuk medan yang ditentukan:

SELECT count(distinct col_name) DARI jadual;

Menggunakan urus niaga

Transaksi menggabungkan urutan tindakan ke dalam satu operasi. Keistimewaannya ialah jika terdapat ralat dalam melaksanakan transaksi, tiada hasil tindakan akan disimpan dalam pangkalan data.

Mari mulakan transaksi menggunakan arahan BEGIN.

Untuk melancarkan semula semua operasi yang terletak selepas BEGIN, gunakan arahan ROLLBACK.

Dan untuk menerapkannya - arahan COMMIT.

Lihat dan tamatkan pertanyaan yang sedang dijalankan

Untuk mendapatkan maklumat tentang permintaan, jalankan arahan berikut:

PILIH pid, umur(query_start, clock_timestamp()), usename, query FROM pg_stat_activity WHERE query != " " DAN pertanyaan TIDAK SUKA "%pg_stat_activity%" ORDER OLEH query_start desc;

Untuk menghentikan permintaan tertentu, jalankan arahan berikut, menunjukkan id proses (pid):

PILIH pg_cancel_backend(procpid);

Untuk menghentikan permintaan, jalankan:

PILIH pg_terminate_backend(procpid);

Bekerja dengan konfigurasi

Mencari dan menukar lokasi kejadian kluster

Situasi mungkin berlaku apabila beberapa kejadian PostgreSQL dikonfigurasikan pada satu sistem pengendalian, yang "duduk" pada port yang berbeza. Dalam kes ini, mencari laluan ke penempatan fizikal bagi setiap contoh adalah tugas yang agak menegangkan. Untuk mendapatkan maklumat ini, jalankan pertanyaan berikut untuk mana-mana pangkalan data dalam kelompok minat:

TUNJUKKAN direktori_data;

Mari tukar lokasi ke lokasi lain menggunakan arahan:

SET data_direktori kepada new_directory_path;

Tetapi untuk perubahan berkuat kuasa, but semula diperlukan.

Mendapatkan senarai jenis data yang tersedia

Kami mendapat senarai jenis data yang tersedia menggunakan arahan:

PILIH nama taip, taip dari pg_type di mana typtype="b";

typname - nama jenis data.
typelen - saiz jenis data.

Menukar tetapan DBMS tanpa but semula

Tetapan PostgreSQL terletak dalam fail khas seperti postgresql.conf dan pg_hba.conf. Selepas menukar fail ini, DBMS perlu menerima tetapan semula. Untuk melakukan ini, pelayan pangkalan data dibut semula. Sudah jelas bahawa anda perlu melakukan ini, tetapi pada versi pengeluaran projek, yang digunakan oleh beribu-ribu pengguna, ini sangat tidak diingini. Oleh itu, PostgreSQL mempunyai fungsi yang membolehkan anda menggunakan perubahan tanpa but semula pelayan:

PILIH pg_reload_conf();

Tetapi, malangnya, ia tidak terpakai kepada semua parameter. Dalam sesetengah kes, but semula diperlukan untuk tetapan digunakan.

.

Sejak versi 6.3 (bertarikh 2 Mac 1998), PostgreSQL menggunakan soket domain UNIX. Soket ini boleh didapati dalam direktori /tmp/.s.PGSQL.5432. Sifat ini boleh didayakan menggunakan bendera "-i" masuk guru pos dan ini bermaksud "mendengar pada soket TCP/IP", serupa dengan soket domain UNIX.

Jadual 1. Postmaster dan PHP

Anda juga boleh membuat sambungan menggunakan arahan: $conn = pg_Connect("host=localhost port=5432 dbname=chris");

Untuk menggunakan antara muka objek besar, anda mesti memasukkannya dalam blok transaksi. Blok transaksi bermula bermula dan, jika transaksi berjaya, selesai komited Dan tamat. Jika transaksi gagal, maka transaksi mesti ditutup menggunakan pengguguran Dan kembalikan.

pg_Tutup

pg_Close -- menutup sambungan PostgreSQL
Penerangan
bool pg_close(sambungan int);

Mengembalikan palsu jika sambungan bukan nombor sambungan yang sah. Menutup sambungan pangkalan data PostgreSQL yang dikaitkan dengan nombor sambungan yang ditentukan.

pg_cmdTuples

pg_cmdTuples -- mengembalikan bilangan tupel yang dipanggil
Penerangan
int pg_cmdtuples(int result_id);

pg_cmdTuples() mengembalikan bilangan tupel (permintaan) yang dijana oleh pertanyaan INSERT, UPDATE dan DELETE. Jika tiada tupel dipanggil, fungsi akan mengembalikan 0.

Contoh 1. pg_cmdtuples

pg_Connect

pg_Connect -- membuka sambungan
Penerangan
int pg_connect (hos rentetan, port rentetan, pilihan rentetan, rentetan tty, rentetan dbname);

Mengembalikan nombor sambungan pada kejayaan, atau palsu jika sambungan tidak dapat diwujudkan. Membuka sambungan ke pangkalan data PostgreSQL. Setiap hujah mestilah dalam petikan, termasuk nombor port. Pilihan dan hujah tty adalah pilihan dan boleh ditinggalkan. Fungsi ini mengembalikan nombor sambungan, yang diperlukan oleh fungsi PostgreSQL yang lain. Anda boleh membuka berbilang sambungan pada masa yang sama.

Sambungan juga boleh dibuat dengan arahan berikut: $conn = pg_connect("dbname=marliese port=5432"); Pilihan tambahan (kecuali dbname Dan pelabuhan) - Ini tuan rumah , tty Dan pilihan .

pg_DBname

pg_DBname -- nama pangkalan data
Penerangan
rentetan pg_dbname(sambungan int);

Mengembalikan nama pangkalan data yang nombor sambungan PostgreSQL yang ditentukan disambungkan, atau mengembalikan palsu jika nombor sambungan yang ditentukan tidak betul.

pg_ErrorMessage

pg_ErrorMessage -- mesej ralat
Penerangan
rentetan pg_errormessage(sambungan int);

Mengembalikan rentetan yang mengandungi mesej ralat, atau palsu apabila gagal. Butiran ralat mungkin tidak boleh diambil oleh pg_errormessage(); jika ralat berlaku pada akses terakhir ke pangkalan data yang mana nombor sambungan yang sah wujud, maka fungsi itu akan mengembalikan rentetan yang mengandungi mesej ralat yang dikeluarkan oleh pelayan.

pg_Exec

pg_Exec -- menjalankan permintaan
Penerangan
int pg_exec(sambungan int, pertanyaan rentetan);

Mengembalikan bendera hasil jika permintaan boleh dilancarkan, palsu jika terdapat ralat atau jika nombor sambungan tidak betul. Butiran ralat boleh diperoleh menggunakan fungsi jika nombor sambungan adalah betul. Fungsi menghantar pertanyaan SQL ke pangkalan data PostgreSQL yang dikenal pasti oleh nombor sambungan. Sambungan mestilah nombor sambungan yang sah, yang dikembalikan oleh fungsi. Nilai pulangan fungsi ini diperlukan untuk mengakses hasil fungsi PostgreSQL yang lain.

Ulasan: PHP2 mengembalikan 1 jika pertanyaan tidak mengembalikan data (seperti sisipan atau kemas kini) dan lebih besar daripada 1 walaupun untuk pilihan yang tidak mengembalikan apa-apa. Tiada andaian sedemikian dalam PHP3.

pg_Fetch_Array

pg_Fetch_Array -- mengembalikan entri sebagai tatasusunan
Penerangan
array pg_fetch_array(int result, int row);

Mengembalikan tatasusunan yang merujuk entri yang terhasil, atau palsu jika tiada lagi entri.

pg_fetch_array() ialah versi lanjutan. Selain menyimpan data di bawah indeks angka dalam tatasusunan yang terhasil, fungsi ini juga menyimpan data di bawah indeks bersekutu menggunakan nombor medan sebagai kunci.

Perlu diingatkan bahawa fungsi pg_fetch_array() hampir sama dalam kelajuan, walaupun ia menyediakan keupayaan tambahan.

Untuk maklumat lanjut lihat

Contoh 1: Susunan Rekod PostgreSQL

pg_Fetch_Object

pg_Fetch_Object -- mengembalikan entri sebagai objek
Penerangan
objek pg_fetch_object(int result, int row);

Mengembalikan objek dengan sifat yang merujuk kepada entri yang terhasil, atau palsu jika tiada lagi entri.

Contoh 1: Mendapatkan objek Postgres

Ralat menyambung ke pangkalan data

pengarang." ("; echo $data->jahr ."): "; echo $data->titel."
"; $row++; endwhile; ?>
$item."\n";   sementara waktu;   $row++;  sementara waktu;  echo "----------\n";  ?>

pg_Fetch_Row

pg_Fetch_Row -- ambil masukan sebagai tatasusunan bernombor
Penerangan
array pg_fetch_row(int result, int row);

Mengembalikan tatasusunan yang merujuk entri yang terhasil, atau palsu jika tiada lagi entri.

pg_fetch_row() mengembalikan rekod data tunggal daripada hasil yang dikenal pasti oleh ID hasil yang ditentukan. Entri dikembalikan sebagai tatasusunan. Setiap lajur hasil disimpan dalam elemen tatasusunan, bermula pada 0.

Panggilan fungsi seterusnya pg_fetch_row() akan mengembalikan entri seterusnya dalam set keputusan, atau palsu jika tiada lagi entri.

pg_FieldIsNull

pg_FieldIsNull -- Menguji medan untuk nilai nol
Penerangan
int pg_fieldisnull (int result_id, int row, mixed field);

Menyemak sama ada medan mempunyai nilai NULL atau tidak. Mengembalikan 0 jika medan dalam entri yang ditentukan bukan nol. Mengembalikan 1 jika medan entri yang dinyatakan adalah batal. Medan boleh dikenal pasti dengan nombor atau nama. Penomboran rekod bermula dari 0.

pg_FieldName

pg_FieldName -- mengembalikan nama medan
Penerangan
rentetan pg_fieldname(int result_id, int field_number);

pg_FieldName() akan mengembalikan nama medan yang sepadan dengan nombor lajur yang ditentukan dalam ID hasil PostgreSQL yang ditentukan. Penomboran medan bermula dari 0.

pg_FieldNum

pg_FieldNum -- mengembalikan nombor lajur
Penerangan
int pg_fieldnum(int result_id, string field_name);

pg_FieldNum() mengembalikan nombor lajur yang sepadan dengan nama medan yang ditentukan dalam ID hasil PosgreSQL yang ditentukan. Penomboran medan bermula dari 0. Fungsi akan mengembalikan -1 apabila ralat.

pg_FieldPrtLen

pg_FieldPrtLen -- Mengembalikan panjang boleh cetak
Penerangan
int pg_fieldprtlen(int result_id, int row_number, string field_name);

pg_FieldPrtLen() mengembalikan panjang boleh cetak sebenar (bilangan aksara) bagi data yang ditentukan dalam hasil PosgreSQL. Penomboran rekod bermula dari 0. Jika terdapat ralat, fungsi akan mengembalikan -1.

pg_FieldSize

pg_FieldSize -- mengembalikan saiz storan dalaman medan yang dinamakan
Penerangan
int pg_fieldsize(int result_id, string field_name);

pg_FieldSize() mengembalikan saiz storan dalaman medan bernama yang ditentukan dalam hasil PosgreSQL yang ditentukan. Saiz medan -1 menunjukkan panjang medan berubah-ubah. Fungsi ini akan mengembalikan palsu apabila ralat.

pg_FieldType

pg_FieldType -- mengembalikan jenis medan bernama yang sepadan
Penerangan
int pg_fieldtype(int result_id, int field_number);

pg_FieldType() mengembalikan rentetan yang mengandungi nama jenis medan yang ditentukan dalam ID hasil PosgreSQL yang ditentukan. Penomboran medan bermula dari 0.

pg_FreeResult

pg_FreeResult -- membebaskan memori
Penerangan
int pg_freeresult(int result_id);

pg_locreate

pg_locreate -- mencipta objek besar
Penerangan
int pg_locreate(int conn);

pg_locreate() Mencipta pemetaan objek besar (ILO) dan mengembalikan pengecam objek besar. samb menentukan sambungan yang betul ke pangkalan data. Mod akses PostgreSQL INV_READ, INV_WRITE, dan INV_ARCHIVE tidak disokong objek sentiasa dicipta untuk membaca dan menulis. INV_ARCHIVE telah dialih keluar daripada PostgreSQL itu sendiri (versi 6.3 dan lebih tinggi).

pg_loopen

pg_loopen -- membuka objek besar
Penerangan
int pg_loopen(int conn, int objoid, mod rentetan);

pg_loopen() Membuka paparan objek besar (ILO) dan mengembalikan pemegang fail kepada objek besar. Deskriptor fail mengandungi maklumat tentang sambungan. Jangan tutup sambungan sehingga deskriptor fail LOB ditutup. objoid menentukan ID LOB yang betul dan mod boleh menjadi salah satu daripada "r", "w", atau "rw".

pg_loread

pg_loread -- membaca objek besar
Penerangan
rentetan pg_loread(int fd, int len);

pg_loread() membaca len bait daripada objek besar dan mengembalikannya sebagai rentetan. fd mentakrifkan deskriptor fail LOB yang sah len mentakrifkan saiz segmen maksimum yang mungkin bagi objek besar.

pg_loreadall

pg_loreadall -- membaca keseluruhan objek besar
Penerangan
void pg_loreadall(int fd);

pg_loreadall() membaca objek besar dan menghantarnya terus ke penyemak imbas, selepas semua pengepala yang diperlukan. Terutamanya digunakan untuk menghantar data binari seperti imej dan fail bunyi.

pg_lounlink

pg_lounlink -- memadam objek besar
Penerangan
void pg_lounlink(int conn, int lobjid);

pg_lounlink() memadam objek besar dengan ID objek besar lobjid .

pg_lowrite

pg_lowrite -- menulis ke objek besar
Penerangan
int pg_lowrite(int fd, string buf);

pg_lowrite() menulis data kepada objek besar daripada pembolehubah buf dan mengembalikan bilangan data yang ditulis atau palsu atas kesilapan. fd ialah pemegang fail objek besar daripada fungsi.

pg_NumFields

pg_NumFields -- mengembalikan bilangan medan
Penerangan
int pg_numfields(int result_id);

pg_NumFields() mengembalikan bilangan medan (lajur) dalam hasil PostgreSQL. Parameter ialah pengecam hasil yang betul yang diperolehi oleh fungsi. Fungsi ini akan mengembalikan -1 apabila ralat.

pg_NumRows

pg_NumRows -- mengembalikan bilangan rekod
Penerangan
int pg_numrows(int result_id);

Sambungan juga boleh dibuat dengan arahan berikut: $conn = pg_pconnect("dbname=marliese port=5432"); Parameter lain kecuali dbname Dan pelabuhan, - Ini tuan rumah , tty Dan pilihan .

pg_Port

pg_Port -- mengembalikan nombor port
Penerangan
int pg_port(int connection_id);

pg_Port() mengembalikan nombor port yang mana ID sambungan PostgreSQL yang ditentukan disambungkan.

pg_Result

pg_Result -- mengembalikan data daripada ID hasil
Penerangan
pg_result bercampur (int result_id, int row_number, mixed fieldname);

pg_Result() mengembalikan data daripada ID hasil yang diperolehi oleh . Pilihan nombor_baris Dan nama medan tentukan sel jadual mana data akan diambil. Penomboran rekod dan medan bermula dari 0. Daripada nama medan, anda boleh menggunakan nombor medan (tanpa petikan).

PostgreSQL mempunyai banyak jenis data, tetapi hanya yang asas sahaja disokong di sini. Semua jenis integer, boolean dan jenis pengecam dikembalikan sebagai integer. Semua jenis titik terapung dan nombor nyata dikembalikan sebagai dua jenis. Semua jenis lain, termasuk tatasusunan, dikembalikan sebagai rentetan, diformat dengan cara yang sama seperti yang anda lihat dalam atur cara psql.

pg_tty

pg_tty -- mengembalikan nama tty
Penerangan
rentetan pg_tty(int connection_id);

pg_tty() mengembalikan nama tty yang pelayan berikan kepada ID sambungan PostgreSQL yang ditentukan.

pg_update (sumber $sambungan , rentetan $table_name , tatasusunan $data , array $keadaan [, int $options = PGSQL_DML_EXEC ])

pg_update() menggantikan rekod dalam jadual yang memenuhi syarat syarat data data. Jika hujah diberikan pilihan, data akan diubah oleh fungsi pg_convert(), yang mana parameter daripada hujah ini akan dihantar.

Senarai parameter

Sumber sambungan pangkalan data PostgreSQL.

Nama_jadual

Nama jadual di mana rekod dikemas kini.

susunan( tatasusunan), kekunci yang sepadan dengan nama lajur jadual table_name, dan nilainya akan menggantikan data dalam lajur ini.

keadaan

susunan( tatasusunan), kekunci yang sepadan dengan nama lajur jadual table_name . Hanya baris yang nilai medannya sepadan dengan nilai tatasusunan akan dikemas kini.

Pilihan

Salah satu pemalar PGSQL_CONV_OPTS, PGSQL_DML_NO_CONV, PGSQL_DML_ESCAPE, PGSQL_DML_EXEC, PGSQL_DML_ASYNC atau PGSQL_DML_STRING, atau gabungan daripadanya. Jika pilihan mengandungi PGSQL_DML_STRING, fungsi akan mengembalikan rentetan. Jika dipasang PGSQL_DML_NO_CONV atau PGSQL_DML_ESCAPE, kemudian fungsi pg_convert() tidak dipanggil secara dalaman.

Kembalikan nilai

Pulangan BENAR apabila berjaya disiapkan atau SALAH sekiranya berlaku kesilapan. Fungsi ini akan mengembalikan rentetan ( tali), jika malar PGSQL_DML_STRING terkandung dalam pilihan.

Contoh

Contoh #1 Contoh penggunaan pg_update()

$db = pg_connect("dbname=foo" );
$data = array("field1" => "AA" , "field2" => "BB" );

// Ini selamat kerana $_POST ditukar secara automatik
$res = pg_update ($db, "post_log", $_POST, $data);
jika ($res) (
bergema "Data dikemas kini:$res\n" ;
) lain (
bergema "Data tidak sah mesti dihantar\n";
}
?>