Toegang tot Postgresql php-schema. PostgreSQL-functies. Veldtype veilig wijzigen

PostgreSQL-functies

Postgres, oorspronkelijk ontwikkeld door de Computer Science Department van UC Berkeley, was de pionier van veel van de objectgeoriënteerde concepten die nu beschikbaar zijn in sommige commerciële databases. Het biedt ondersteuning voor de SQL92/SQL99-taal, transactie-integriteit en type-uitbreidbaarheid. PostgreSQL is een open source-afstammeling van de originele Berkeley-code.

De PostgreSQL-database opent een Source-product dat gratis beschikbaar is. Om PostgreSQL-ondersteuning te gebruiken, hebt u PostgreSQL 6.5 of hoger nodig. PostgreSQL 7.0 of hoger - voor alle PostgreSQL-modulefuncties. PostgreSQL ondersteunt veel tekencoderingen, inclusief multibyte-tekencoderingen. De huidige versie en informatie over PostgreSQL is te vinden op http://www.postgresql.org/.

Om PostgreSQL-ondersteuning in te schakelen, is de optie --with-pgsql[=DIR] vereist bij het compileren van PHP. Als de module voor gedeelde objecten beschikbaar is, kan de PostgreSQL-module worden geladen met behulp van de extensierichtlijn in het php.ini-bestand of de functie dl(). Ondersteunde ini-richtlijnen worden beschreven in het bestand php.ini-dist dat bij de broncode van de distributie wordt geleverd.


Waarschuwing!

De functienamen van PostgreSQL worden in release 4.2.0 gewijzigd om naleving van de bestaande coderingsstandaarden te garanderen. De meeste nieuwe namen zullen extra onderstrepingstekens hebben, bijvoorbeeld pg_lo_open(). Sommige functies zijn hernoemd vanwege de consistentie. bijvoorbeeld pg_exec() in pg_query(). De oude namen kunnen worden gebruikt in 4.2.0 en sommige 4.2.0-releases, maar deze kunnen in de toekomst worden verwijderd.

Tafel 1. Functienaam verandert
Oude naam Nieuwe naam
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_veldnaam() pg_veldnaam()
pg_veldgrootte() pg_field_size()
pg_veldnum() pg_field_num()
pg_fieldprtlen() pg_field_prtlen()
pg_fieldisnull() pg_field_is_null()
pg_freeresult() pg_free_result()
pg_resultaat() 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()

Niet alle functies worden in alle builds ondersteund. Dit hangt af van de versie van uw libpq (de PostgreSQL C Client-interface) en hoe libpq is gecompileerd. Als er een functie ontbreekt, ondersteunt libpq niet de mogelijkheden die voor die functie vereist zijn.

Het is ook belangrijk dat u een libpq gebruikt die nieuwer is dan de PostgreSQL Server waarmee u verbinding maakt. Als u een libpq gebruikt die ouder is dan PostgreSQL Server verwacht, zult u problemen ondervinden.

Sinds versie 6.3 (02/03/1998) gebruikt PostgreSQL standaard een unix-domeinsocket. De TCP-poort is standaard NIET geopend. De tabel beschrijft deze nieuwe verbindingsopties. Deze socket is te vinden in /tmp/.s.PGSQL.5432. Deze optie kan worden ingeschakeld met de vlag "-i" voor postmeester, en de waarde ervan zal zijn: "luister zowel naar TCP/IP-sockets als naar Unix-domeinsockets."

Tabel 2. Postmaster en PHP

Een verbinding met de PostgreSQL-server kan tot stand worden gebracht met de volgende waardenparen op de opdrachtregel: $conn = pg_connect("host=myHost port=myPort tty=myTTY options=myOptions dbname=myDB user=myUser wachtwoord=myPassword ");

Vorige syntaxis: $conn = pg_connect("host", "poort", "opties", "tty", "dbnaam") wordt niet langer aanbevolen.

Omgevingsvariabelen beïnvloeden het gedrag van de PostgreSQL-server/client. Het PostgreSQL-model zoekt bijvoorbeeld naar de omgevingsvariabele PGHOST als de hostnaam niet in de verbindingsreeks staat. Ondersteunde omgevingsvariabelen verschillen per versie. Zie de PostgreSQL Programmer's Manual (libpq - Omgevingsvariabelen) voor details.

Zorg ervoor dat u de omgevingsvariabelen voor de juiste gebruiker instelt. Gebruik $_ENV of getenv() om te controleren welke omgevingsvariabelen beschikbaar zijn voor het huidige proces.

Vanaf PostgreSQL 7.1.0 kunt u 1 GB in een tekstveld opslaan. Oudere versies kunnen beperkingen hebben op de blokgrootte (de standaardwaarde was 8 KB, het maximum was 32 KB, bepaald tijdens het compileren).

Om de grote objectinterface (lo) te gebruiken, moet u lo-functies in het transactieblok opnemen. Een transactieblok begint met een SQL-instructie BEGINNEN, en als de transactie correct was, eindigt VERBINDEN of EINDE. Als een transactie mislukt, moet deze worden afgesloten met TERUGROLLEN of AFBREKEN.

U mag de verbinding met de PostgreSQL-server niet verbreken voordat u het grote object sluit.

Inhoud

pg_affected_rows - retourneert het aantal betrokken rijen (paren/tuples) pg_cancel_query - annuleert een asynchrone query pg_client_encoding - haalt de clientcodering op pg_close - sluit een PostgreSQL-verbinding pg_connect - opent een PostgreSQL-verbinding pg_connection_busy - haalt op of de verbinding gesloten is of niet pg_connection_reset - maakt opnieuw verbinding ) pg_connection_status - haalt de verbindingsstatus op pg_convert - converteert de waarde van een associatieve array naar een waarde die geschikt is voor de SQL-instructie pg_copy_from - voegt records in een tabel in van een array pg_copy_to - kopieert een tabel naar een array pg_dbname - haalt de databasenaam pg_delete op - verwijdert records pg_end_copy - synchroniseert met PostgreSQL backend pg_escape_bytea - mnemonizes/escape binary voor type bytea pg_escape_string - mnemonizes string voor type text/char pg_execute - Verzendt een verzoek om een ​​kant-en-klare instructie uit te voeren met gegeven parameters, en wacht op het resultaat pg_fetch_all_columns - parses alle rijen in een specifieke kolom van het resultaat als een array pg_fetch_all - ontleedt alle rijen uit het resultaat als array pg_fetch_array - haalt een rij op als een array pg_fetch_assoc - ontleedt een rij als een associatieve array pg_fetch_object - haalt een rij op als een object pg_fetch_result - retourneert waarden uit de resulterende bron pg_fetch_row - haalt een rij op als een opsombare array pg_field_is_null - controleert of een veld NUL pg_field_name - retourneert de naam van het veld pg_field_num - retourneert het nummer van het genoemde veld pg_field_prtlen - retourneert de afdrukbare grootte pg_field_size - retourneert de interne opslaggrootte van het genoemde veld pg_field_type - retourneert de typenaam voor het overeenkomstige veldnummer pg_field_type_oid - retourneert het type identificatie (OID) voor het corresponderende veldnummer pg_free_result - maakt het resulterende geheugen vrij pg_get_notify - Ontvangt een SQL-waarschuwingsbericht pg_get_pid - Haalt de backend-proces-ID op pg_get_result - Haalt het resultaat op van een asynchrone aanvraag pg_host - Geeft de hostnaam terug die is gekoppeld aan de verbinding pg_insert - Voegt in een array in een tabel pg_last_error - Haalt de laatste tekenreeks met verbindingsfoutmeldingen op pg_last_notice - Geeft de laatste melding van de PostgreSQL-server terug pg_last_oid - retourneert de oid van het laatste object pg_lo_close - sluit een groot object pg_lo_create - maakt een groot object aan pg_lo_export - exporteert een groot object object naar een bestand pg_lo_import - importeert een groot object uit een bestand pg_lo_open - opent een groot object pg_lo_read_all - leest het gehele grote object en stuurt het naar de browser pg_lo_read - leest groot object pg_lo_seek - zoekt naar de positie van een groot object en pg_lo_tell - retourneert de huidige positie van een groot object

Standaardsjabloonbibliotheek ( Standaard sjabloonbibliotheek , STL) is opgenomen in de standaardbibliotheek van de C++-taal. Het omvat implementaties van de meest gebruikte containers en algoritmen, waardoor programmeurs de routine van het steeds opnieuw herschrijven ervan kunnen vermijden. Bij het ontwikkelen van containers en de daarop toegepaste algoritmen (zoals het verwijderen van identieke elementen, sorteren, zoeken, etc.) moet vaak worden ingeboet aan veelzijdigheid of prestatie. De STL-ontwikkelaars stelden zichzelf echter de taak om de bibliotheek zowel efficiënt als universeel te maken. Om dit probleem op te lossen, werden universele middelen van de C++-taal zoals sjablonen en overbelasting van operators gebruikt. In de volgende presentatie zullen we vertrouwen op de STL-implementatie van Microsoft, samen met de Visual C++ 6.0-compiler. Het meeste van het bovenstaande zal echter ook gelden voor STL-implementaties door andere compilers.

De belangrijkste concepten in STL zijn de concepten container (container), algoritme (algoritme) en iterator (iterator).

Houderis een opslagplaats van objecten (zowel ingebouwde als door de gebruiker gedefinieerde typen). Doorgaans worden containers geïmplementeerd als klassensjablonen. De eenvoudigste typen containers (statische en dynamische arrays) zijn rechtstreeks in de C++-taal ingebouwd. Bovendien bevat de standaardbibliotheek implementaties van containers zoals vector, lijst, wachtrij, kaart, set en enkele andere.

Algoritmeis een functie voor het manipuleren van objecten in een container. Typische voorbeelden van algoritmen zijn sorteren en zoeken. De STL implementeert ongeveer 60 algoritmen die kunnen worden toegepast op verschillende containers, inclusief arrays die zijn ingebouwd in de C++-taal.

Iteratoris een abstractie van een aanwijzer, dat wil zeggen een object dat kan verwijzen naar andere objecten in de container. De belangrijkste functies van een iterator zijn het verlenen van toegang tot het object waarnaar het verwijst (dereferentie) en het verplaatsen van het ene containerelement naar het andere (iteratie, vandaar de naam iterator). Voor ingebouwde containers worden reguliere verwijzingen gebruikt als iteratoren. In het geval van complexere containers worden iterators geïmplementeerd als klassen met een reeks overbelaste operators.

Naast de gemarkeerde elementen in de STL zijn er een aantal aanvullende concepten ; Sommigen van hen moet je ook leren kennen.

Toewijzer(allocator) is een object dat verantwoordelijk is voor het toewijzen van geheugen voor containerelementen. Aan elke standaardcontainer is een allocator gekoppeld (het type ervan wordt doorgegeven als een van de sjabloonparameters). Als een algoritme geheugen voor elementen moet toewijzen, moet het dit doen via een allocator. In dit geval kunt u er zeker van zijn dat gedistribueerde objecten op de juiste manier worden vernietigd.

De STL bevat een standaard allocatorklasse (beschreven in het xmemory-bestand). Dit is wat alle containers die in de STL zijn geïmplementeerd standaard gebruiken. De gebruiker kan echter zijn eigen klasse implementeren. Dit is zeer zelden nodig, maar kan soms worden gedaan voor efficiëntie- of foutopsporingsdoeleinden.

Laten we dieper ingaan op de overweging van de geïntroduceerde concepten.

Containers . Elke container biedt een strikt gedefinieerde interface waarmee algoritmen ermee kunnen communiceren. Containerspecifieke iterators bieden deze interface. Het is belangrijk om te benadrukken dat er geen extra lidfuncties worden gebruikt voor interactie tussen algoritmen en containers. Dit wordt gedaan omdat standaardalgoritmen moeten werken, inclusief de ingebouwde containers van de C++-taal, die iterators (pointers) hebben maar verder niets. Wanneer u uw eigen container maakt, is het implementeren van een iterator dus het absolute minimum.

Elke container implementeert een specifiek type iterator. Hiermee wordt het meest functionele iteratortype geselecteerd dat effectief kan worden geïmplementeerd voor een bepaalde container. "Efficiënt" betekent dat de snelheid van het uitvoeren van bewerkingen op de iterator niet afhankelijk mag zijn van het aantal elementen in de container. Er wordt bijvoorbeeld een willekeurige toegang-iterator geïmplementeerd voor een vector, en een bidirectionele iterator voor een lijst. Omdat de snelheid van een lijstbewerking lineair is met de lengte ervan, wordt er geen random access iterator voor een lijst geïmplementeerd.

Ongeacht de feitelijke organisatie van de container (vector, lijst, boom), kunnen de daarin opgeslagen elementen als een reeks worden beschouwd. De iterator van het eerste element in deze reeks wordt geretourneerd door de functie begin(), en de iterator van het element dat volgt op het laatste wordt geretourneerd door de functie end(). Dit is erg belangrijk, omdat alle algoritmen in STL nauwkeurig werken met reeksen die zijn gespecificeerd door start- en einditeratoren.

Naast reguliere iteratoren in de STL zijn er omgekeerde iteratoren ( omgekeerde iterator ). Een omgekeerde iterator is anders omdat deze in omgekeerde volgorde door de reeks elementen in een container itereert. Met andere woorden, de bewerkingen + en - zijn omgekeerd. Hierdoor kunnen de algoritmen worden toegepast op zowel directe als omgekeerde reeksen elementen. Met de zoekfunctie kunt u bijvoorbeeld zoeken naar elementen van zowel het “begin” als het “einde” van een container.

In STL zijn containers onderverdeeld in drie hoofdgroepen (tabel 2): ​​reekscontainers, associatieve containers en containeradapters. De eerste twee groepen worden gecombineerd tot eersteklas containers.

tafel 2

Containerklasse STL

Beschrijving

Volgorde containers

vector

Dynamische array

deque

Bidirectionele wachtrij

lijst

Bidirectionele lineaire lijst

Associatieve containers

Associatieve container met unieke sleutels

meervoudig ingesteld

Associatieve container die dubbele sleutels mogelijk maakt

Associatieve container voor sets met unieke elementen

multikaart

Associatieve container voor sets met dubbele elementen

Containeradapters

stapel

Standaard stapel

wachtrij

Standaard wachtrij

prioriteits-rij

Prioriteits-rij

Elke containerklasse geïmplementeerd in STL , beschrijft de reeks typen die aan de container zijn gekoppeld. U moet dezelfde praktijk volgen bij het schrijven van uw eigen containers. Hier is een lijst met de belangrijkste soorten:

waarde_type - elementtype;

maat_type - een type voor het opslaan van het aantal elementen (meestal maat_t);

iterator - iterator voor containerelementen;

sleutel type - sleuteltype (in een associatieve container).

Naast typen kunnen we een reeks functies onderscheiden die bijna elke container in STL implementeert (tabel 3). Ze zijn niet vereist voor interactie met algoritmen, maar hun implementatie verbetert de uitwisselbaarheid van containers in het programma. STL is zo ontworpen dat containers vergelijkbare functionaliteit bieden.

tafel 3

Algemene methoden voor alle STL-containers

Beschrijving

standaardconstructeur

Standaardconstructor. Meestal heeft een container er meerdere ontwerpers

kopieer constructor

Kopieer constructor

vernietiger

Vernietiger

leeg

Retourneert true als er geen elementen in de container zitten, anders false

max_grootte

Retourneert het maximale aantal elementen voor een container

maat

Retourneert het aantal elementen in de container op het huidige tijdstip

exploitant =

Wijst de ene container aan de andere toe

exploitant<

Retourneert true als de eerste container kleiner is dan de tweede, anders false

exploitant<=

Retourneert true als de eerste container niet groter is dan de tweede, anders false

exploitant >

Retourneert true als de eerste container groter is dan de tweede, anders false

exploitant >=

Retourneert true als de eerste container niet kleiner is dan de tweede, anders false

exploitant ==

Retourneert waar als de vergeleken containers gelijk zijn, anders onwaar

exploitant !=

Retourneert true als de vergeleken containers niet gelijk zijn, anders false

ruil

Verwisselt elementen van twee containers

Functies alleen beschikbaar in eersteklas containers

beginnen

Twee versies van deze functie retourneren een iterator of een const_iterator, die verwijst naar het eerste element van de container

Twee versies van deze functie retourneren een iterator of een const_iterator, die verwijst naar de volgende positie na het einde van de container

rbegin

Twee versies van deze functie retourneren beide reverse_iterator of reverse_const_iterator , wat verwijst naar het laatste element van de container

scheur

Twee versies van deze functie retourneren een reverse_iterator of een reverse_const_iterator, die verwijst naar de positie vóór het eerste element van de container

invoegen, wissen,

Hiermee kunt u elementen in het midden van een reeks invoegen of verwijderen

Bijzettafeltje 3

duidelijk

Verwijdert alle elementen uit een container

voorkant, achterkant

push_back, pop_back

Hiermee kunt u het laatste element in een reeks toevoegen of verwijderen

push_front, pop_front

Hiermee kunt u het eerste element in een reeks toevoegen of verwijderen

Iterators worden doorgaans gemaakt als vrienden van de klassen waarmee ze werken, waardoor directe toegang tot de privégegevens van die klassen mogelijk is. Aan een enkele container kunnen meerdere iterators zijn gekoppeld, die elk hun eigen ‘positionele informatie’ bijhouden (tabel 4).

Tabel 4

Iteratortype

Toegang

Dereferenties

Iteratie

Vergelijking

Uitvoeriterator

(uitvoeriterator)

Alleen opnemen

Invoeriterator

(invoeriterator)

Alleen lezen

*, ->

==, !=

Voorwaartse iterator

(voorwaartse iterator)

Lezen en schrijven

*, ->

==, !=

Bidirectionele iterator(bidirectionele iterator)

Lezen en schrijven

*, ->

++, --

==, !=

Iterator voor willekeurige toegang

(willekeurig - toegangstrator)

Lezen en schrijven

*, ->,

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

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

Er zijn veel PostgreSQL-tutorials op internet die de basisopdrachten beschrijven. Maar als je dieper in het werk duikt, komen er praktische problemen naar voren waarvoor geavanceerde teams nodig zijn.

Dergelijke opdrachten of fragmenten worden zelden in de documentatie beschreven. Laten we een paar voorbeelden bekijken die nuttig zijn voor zowel ontwikkelaars als databasebeheerders.

Informatie verkrijgen over een database

Databasegrootte

Om de fysieke grootte van de databasebestanden (opslag) te achterhalen, gebruiken we de volgende query:

SELECTEER pg_database_size(huidige_database());

Het resultaat wordt weergegeven als een nummer in de vorm 41809016.

current_database() is een functie die de naam van de huidige database retourneert. In plaats daarvan kunt u de naam in tekst invoeren:

SELECTEER pg_database_size("mijn_database");

Om informatie in voor mensen leesbare vorm te verkrijgen, gebruiken we de functie pg_size_pretty:

SELECTEER pg_size_pretty(pg_database_size(huidige_database()));

Als gevolg hiervan verkrijgen we informatie van het formulier 40 Mb.

Lijst van tabellen

Soms heeft u een lijst met databasetabellen nodig. Hiervoor gebruiken we de volgende query:

SELECTEER tabelnaam UIT informatie_schema.tables WAAR tabelschema NIET IN ("informatie_schema", "pg_catalog");

information_schema is een standaarddatabaseschema dat verzamelingen weergaven bevat, zoals tabellen, velden, enz. Tabelweergaven bevatten informatie over alle tabellen in de database.

De onderstaande query selecteert alle tabellen uit het opgegeven schema van de huidige database:

SELECTEER tabelnaam UIT informatie_schema.tables WAAR tabelschema NIET IN ("informatie_schema", "pg_catalog") EN tabel_schema IN("public", "mijnschema");

De laatste IN-voorwaarde kan worden gebruikt om de naam van een specifiek schema op te geven.

Tafelgrootte

Net als bij het verkrijgen van de grootte van een database, kan de grootte van de gegevens van een tabel worden berekend met behulp van de juiste functie:

SELECTEER pg_relation_size("accounts");

De functie pg_relation_size retourneert de hoeveelheid schijfruimte die een opgegeven laag van een bepaalde tabel of index op schijf in beslag neemt.

Naam van de grootste tafel

Voer de volgende query uit om een ​​lijst met tabellen in de huidige database weer te geven, gesorteerd op tabelgrootte:

SELECTEER relname, relpages VAN pg_class BESTEL OP relpages DESC;

Om informatie over de grootste tabel weer te geven, beperken we de zoekopdracht met LIMIT:

SELECT relname, relpages VAN pg_class BESTEL OP relpages DESC LIMIT 1;

relname - naam van de tabel, index, weergave, etc.
relpages - de grootte van de schijfrepresentatie van deze tabel in aantal pagina's (standaard is één pagina 8 KB).
pg_class is een systeemtabel die informatie bevat over relaties tussen databasetabellen.

Lijst met verbonden gebruikers

Voer de volgende query uit om de naam, het IP-adres en de gebruikte poort van verbonden gebruikers te achterhalen:

SELECT datname,usename,client_addr,client_port FROM pg_stat_activity;

Gebruikersactiviteit

Gebruik de volgende query om de verbindingsactiviteit van een specifieke gebruiker te achterhalen:

SELECTEER datname VAN pg_stat_activity WAAR usename = "devuser";

Werken met gegevens- en tabelvelden

Dubbele rijen verwijderen

Als het zo is dat de tabel geen primaire sleutel heeft, zullen er waarschijnlijk duplicaten tussen de records voorkomen. Als het voor een dergelijke tabel, vooral een grote, noodzakelijk is om beperkingen in te stellen om de integriteit te controleren, verwijder dan de volgende elementen:

  • dubbele regels,
  • situaties waarin een of meer kolommen worden gedupliceerd (als deze kolommen bedoeld zijn om als primaire sleutel te worden gebruikt).

Laten we een tabel met klantgegevens bekijken, waarin een hele rij (de tweede) wordt gedupliceerd.

Met de volgende query kunt u alle duplicaten verwijderen:

VERWIJDEREN VAN klanten WAAR ctid NIET IN IS (SELECT max(ctid) VAN klanten GROEPEREN OP klanten.*);

Het ctid-veld, uniek voor elk record, is standaard verborgen, maar is aanwezig in elke tabel.

Het laatste verzoek is arbeidsintensief, dus wees voorzichtig bij het uitvoeren ervan voor een productieproject.

Beschouw nu het geval waarin veldwaarden worden herhaald.

Als het toegestaan ​​is om duplicaten te verwijderen zonder alle gegevens op te slaan, zullen wij het volgende verzoek uitvoeren:

VERWIJDER VAN klanten WAAR ctid NIET IN IS (SELECTEER max(ctid) VAN klanten GROEPEREN OP klant_id);

Als de gegevens belangrijk zijn, moet u eerst records met duplicaten vinden:

SELECT * VAN klanten WAAR ctid NIET IN IS (SELECT max(ctid) VAN klanten GROEPEREN OP klant_id);

Voordat ze worden verwijderd, kunnen dergelijke records naar een tijdelijke tabel worden verplaatst of kan de klant_id-waarde daarin worden vervangen door een andere.

De algemene vorm van een verzoek tot verwijdering van de hierboven beschreven records is als volgt:

VERWIJDER UIT tabelnaam WAAR ctid NIET IN (SELECTEER max(ctid) UIT tabelnaam GROEPEREN OP kolom1, );

Veldtype veilig wijzigen

Er kan een vraag zijn over het opnemen van een dergelijke taak in deze lijst. In PostgreSQL is het immers heel eenvoudig om het type van een veld te wijzigen met behulp van het ALTER-commando. Laten we als voorbeeld nogmaals naar de klantentabel kijken.

Het veld klant_id gebruikt het gegevenstype Varchar-tekenreeks. Dit is een fout omdat dit veld klant-ID's zou moeten opslaan, die in geheel getalformaat zijn. Het gebruik van varchar is niet gerechtvaardigd. Laten we proberen dit misverstand te corrigeren met behulp van het ALTER-commando:

ALTER TABLE klanten ALTER KOLOM klant_id TYPE geheel getal;

Maar als gevolg van de uitvoering krijgen we een foutmelding:

FOUT: kolom “klant_id” kan niet automatisch worden omgezet naar het type geheel getal
SQL-status: 42804
Tip: Geef een USING-expressie op om de conversie uit te voeren.

Dit betekent dat u het type van een veld niet zomaar kunt wijzigen als er gegevens in de tabel staan. Omdat het varchar-type is gebruikt, kan het DBMS niet bepalen of de waarde een geheel getal is. Hoewel de gegevens overeenkomen met dit type. Om dit punt te verduidelijken, stelt het foutbericht voor om de USING-expressie te gebruiken om onze gegevens correct naar een geheel getal te converteren:

ALTER TABLE klanten ALTER KOLOM klant_id TYPE geheel getal USING (klant_id::geheel getal);

Als gevolg hiervan verliep alles zonder fouten:

Houd er rekening mee dat bij het gebruik van USING het naast een specifieke expressie mogelijk is om functies, andere velden en operators te gebruiken.

Laten we bijvoorbeeld het veld customer_id terug converteren naar varchar , maar met een conversie van de gegevensindeling:

ALTER TABLE klanten ALTER KOLOM klant_id TYPE varchar USING (klant_id || "-" || voornaam);

Als gevolg hiervan zal de tabel er als volgt uitzien:

Het vinden van "verloren" waarden

Wees voorzichtig bij het gebruik van reeksen als primaire sleutel: tijdens de toewijzing worden sommige elementen van de reeks per ongeluk overgeslagen en als gevolg van het werken met de tabel worden sommige records verwijderd. Dergelijke waarden kunnen opnieuw worden gebruikt, maar zijn moeilijk te vinden in grote tabellen.

Laten we twee zoekopties bekijken.

Eerste manier
Laten we de volgende query uitvoeren om het begin van het interval met de "verloren" waarde te vinden:

SELECTEER klant_id + 1 VAN klanten mo WAAR NIET BESTAAT (SELECTEER NULL VAN klanten mi WAAR mi.klant_id = ma.klant_id + 1) BESTEL OP klant_id;

Als resultaat krijgen we de volgende waarden: 5, 9 en 11.

Als u niet alleen het eerste exemplaar, maar ook alle ontbrekende waarden wilt vinden, gebruiken we de volgende (bronintensieve!) query:

MET seq_max AS (SELECT max(klant_id) VAN klanten), seq_min AS (SELECT min(klant_id) VAN klanten) SELECT * FROM genereren_series((SELECT min VAN seq_min),(SELECT max VAN seq_max)) BEHALVE SELECT klant_id VAN klanten;

Als resultaat zien we het volgende resultaat: 5, 9 en 6.

Tweede manier
We krijgen de naam van de reeks die is gekoppeld aan klant_id:

SELECTEER pg_get_serial_sequence("klanten", "klant_id");

En we vinden alle ontbrekende identificatiegegevens:

MET sequence_info AS (SELECT start_waarde, laatste_waarde VAN "SchemaNaam". "SequenceName") SELECTEER genere_series ((sequence_info.start_value), (sequence_info.last_value)) VAN sequence_info BEHALVE SELECT klant_id VAN klanten;

Het aantal rijen in een tabel tellen

Het aantal rijen wordt berekend door de standaard telfunctie, maar kan worden gebruikt met aanvullende voorwaarden.

Totaal aantal rijen in de tabel:

SELECT aantal(*) FROM tabel;

Aantal rijen, op voorwaarde dat het opgegeven veld geen NULL bevat:

SELECT aantal(col_name) FROM tabel;

Aantal unieke rijen voor het opgegeven veld:

SELECT aantal(verschillende kolomnaam) FROM tabel;

Transacties gebruiken

Een transactie combineert een reeks acties in één handeling. Het bijzondere is dat als er een fout optreedt bij het uitvoeren van een transactie, geen van de resultaten van de acties in de database wordt opgeslagen.

Laten we de transactie starten met behulp van het BEGIN-commando.

Om alle bewerkingen na BEGIN terug te draaien, gebruikt u de opdracht ROLLBACK.

En om het toe te passen: het COMMIT-commando.

Bekijk en beëindig actieve query's

Om informatie over verzoeken te verkrijgen, voert u de volgende opdracht uit:

SELECT pid, leeftijd(query_start, clock_timestamp()), gebruiksnaam, query FROM pg_stat_activity WHERE query != " " EN zoekopdracht NIET leuk "%pg_stat_activity%" BESTEL OP query_start desc;

Om een ​​specifiek verzoek te stoppen, voert u het volgende commando uit, waarbij u het proces-ID (pid) aangeeft:

SELECTEER pg_cancel_backend(procpid);

Voer het volgende uit om het verzoek te stoppen:

SELECTEER pg_terminate_backend(procpid);

Werken met configuratie

De locatie van een clusterinstantie zoeken en wijzigen

Er is een situatie mogelijk wanneer meerdere PostgreSQL-instanties op één besturingssysteem zijn geconfigureerd, die op verschillende poorten ‘zitten’. In dit geval is het vinden van het pad naar de fysieke plaatsing van elke instantie een nogal zenuwslopende taak. Om deze informatie te verkrijgen, voert u de volgende query uit voor elke database in het betreffende cluster:

TOON gegevensmap;

Laten we de locatie naar een andere wijzigen met behulp van de opdracht:

SET data_directory naar nieuw_directory_pad;

Maar voordat de wijzigingen van kracht worden, is opnieuw opstarten vereist.

Een lijst met beschikbare gegevenstypen ophalen

We krijgen een lijst met beschikbare gegevenstypen met behulp van de opdracht:

SELECT typnaam, typlen uit pg_type waarbij typtype="b";

typnaam - naam van het gegevenstype.
typelen - grootte van het gegevenstype.

DBMS-instellingen wijzigen zonder opnieuw op te starten

PostgreSQL-instellingen bevinden zich in speciale bestanden zoals postgresql.conf en pg_hba.conf. Na het wijzigen van deze bestanden moet het DBMS de instellingen opnieuw ontvangen. Om dit te doen, wordt de databaseserver opnieuw opgestart. Het is duidelijk dat je dit moet doen, maar op de productieversie van het project, die door duizenden gebruikers wordt gebruikt, is dit zeer ongewenst. Daarom heeft PostgreSQL een functie waarmee u wijzigingen kunt toepassen zonder de server opnieuw op te starten:

SELECTEER pg_reload_conf();

Maar helaas is dit niet van toepassing op alle parameters. In sommige gevallen is opnieuw opstarten vereist voordat de instellingen worden toegepast.

.

Sinds versie 6.3 (gedateerd 2 maart 1998) gebruikt PostgreSQL UNIX-domeinsockets. Deze socket is te vinden in de map /tmp/.s.PGSQL.5432. Deze eigenschap kan worden ingeschakeld met de vlag "-i" in postmeester en dit betekent "luisteren op TCP/IP-sockets", vergelijkbaar met UNIX-domeinsockets.

Tabel 1. Postmaster en PHP

U kunt ook een verbinding tot stand brengen met behulp van het commando: $conn = pg_Connect("host=localhost poort=5432 dbname=chris");

Om de interface voor grote objecten te gebruiken, moet u ze in een transactieblok insluiten. Transactieblok begint beginnen en, als de transactie succesvol is, voltooid verbinden En einde. Als de transactie mislukt, moet de transactie worden afgesloten met abortus En terugrollen.

pg_Sluiten

pg_Close - sluit een PostgreSQL-verbinding
Beschrijving
bool pg_close(int-verbinding);

Retourneert false als de verbinding geen geldig verbindingsnummer is. Sluit de PostgreSQL-databaseverbinding die is gekoppeld aan het opgegeven verbindingsnummer.

pg_cmdTupels

pg_cmdTuples -- retourneert het aantal aangeroepen tupels
Beschrijving
int pg_cmdtuples(int resultaat_id);

pg_cmdTuples() retourneert het aantal tupels (verzoeken) gegenereerd door INSERT-, UPDATE- en DELETE-query's. Als er geen tupels worden aangeroepen, retourneert de functie 0.

Voorbeeld 1. pg_cmdtuples

pg_Verbinden

pg_Connect -- opent een verbinding
Beschrijving
int pg_connect (string host, string poort, string opties, string tty, string dbname);

Retourneert het verbindingsnummer bij succes, of false als de verbinding niet tot stand kan worden gebracht. Opent een verbinding met een PostgreSQL-database. Elk argument moet tussen aanhalingstekens staan, inclusief het poortnummer. De opties en tty-argumenten zijn optioneel en kunnen worden weggelaten. Deze functie retourneert het verbindingsnummer, dat vereist is voor andere PostgreSQL-functies. U kunt meerdere verbindingen tegelijkertijd open hebben.

De verbinding kan ook tot stand worden gebracht met het volgende commando: $conn = pg_connect("dbname=marliese port=5432"); Extra opties (excl dbnaam En haven) - Dit gastheer , tty En opties .

pg_DBnaam

pg_DBname -- databasenaam
Beschrijving
string pg_dbname(int-verbinding);

Retourneert de naam van de database waarmee het opgegeven PostgreSQL-verbindingsnummer is verbonden, of retourneert false als het opgegeven verbindingsnummer onjuist is.

pg_Foutbericht

pg_ErrorMessage -- foutmelding
Beschrijving
string pg_errormessage(int-verbinding);

Retourneert een tekenreeks die het foutbericht bevat, of false bij een fout. De foutdetails kunnen waarschijnlijk niet worden opgehaald door pg_errormessage(); als de fout is opgetreden bij de laatste toegang tot een database waarvoor een geldig verbindingsnummer bestaat, retourneert de functie een string met daarin het foutbericht van de server.

pg_Exec

pg_Exec -- voert een verzoek uit
Beschrijving
int pg_exec(int-verbinding, stringquery);

Retourneert een resultaatvlag als het verzoek kan worden gestart, false als er een fout is of als het verbindingsnummer onjuist is. Foutdetails kunnen worden verkregen met behulp van de functie als het verbindingsnummer correct is. De functie verzendt een SQL-query naar de PostgreSQL-database, geïdentificeerd door het verbindingsnummer. Verbinding moet een geldig verbindingsnummer zijn, dat door de functie wordt geretourneerd. De retourwaarde van deze functie is nodig om toegang te krijgen tot de resultaten van andere PostgreSQL-functies.

Opmerking: PHP2 retourneert 1 als de query geen gegevens retourneert (zoals een invoeging of update) en groter dan 1, zelfs voor selecties die niets retourneren. Dergelijke aannames bestaan ​​niet in PHP3.

pg_Fetch_Array

pg_Fetch_Array -- retourneert het item als een array
Beschrijving
array pg_fetch_array(int resultaat, int rij);

Retourneert een array die verwijst naar het resulterende item, of false als er geen items meer zijn.

pg_fetch_array() is een uitgebreide versie. Naast het opslaan van gegevens onder numerieke indexen in de resulterende array, slaat de functie ook gegevens op onder associatieve indexen, waarbij veldnummers als sleutels worden gebruikt.

Opgemerkt moet worden dat de functie pg_fetch_array() vrijwel identiek in snelheid, hoewel het extra mogelijkheden biedt.

Voor meer informatie zie

Voorbeeld 1: PostgreSQL-recordarray

pg_Fetch_Object

pg_Fetch_Object - retourneert het item als een object
Beschrijving
object pg_fetch_object(int resultaat, int rij);

Retourneert een object met eigenschappen die verwijzen naar het resulterende item, of false als er geen items meer zijn.

Voorbeeld 1: Een Postgres-object verkrijgen

Fout bij verbinden met database

autor." ("; echo $data->jahr ."): "; echo $data->titel."
"; $row++; endwhile; ?>
$item."\n";  eindtijd;  $rij++;  eindtijd;  echo "----------\n";  ?>

pg_Fetch_Row

pg_Fetch_Row -- haal het item op als een genummerde array
Beschrijving
array pg_fetch_row(int resultaat, int rij);

Retourneert een array die verwijst naar het resulterende item, of false als er geen items meer zijn.

pg_fetch_row() retourneert één gegevensrecord van het resultaat geïdentificeerd door de opgegeven resultaat-ID. De invoer wordt geretourneerd als een array. Elke resultaatkolom wordt opgeslagen in een array-element, beginnend bij 0.

Volgende functieaanroep pg_fetch_row() retourneert de volgende invoer in de resultatenset, of false als er geen invoer meer is.

pg_FieldIsNull

pg_FieldIsNull -- Test een veld op een nulwaarde
Beschrijving
int pg_fieldisnull (int resultaat_id, int rij, gemengd veld);

Controleert of een veld een NULL-waarde heeft of niet. Retourneert 0 als het veld in de opgegeven invoer niet nul is. Retourneert 1 als het veld van het opgegeven item nul is. Het veld kan worden geïdentificeerd door een nummer of een naam. De nummering van records begint vanaf 0.

pg_Veldnaam

pg_FieldName -- retourneert de veldnaam
Beschrijving
string pg_veldnaam(int resultaat_id, int veldnummer);

pg_FieldName() retourneert de veldnaam die overeenkomt met het opgegeven kolomnummer in de opgegeven PostgreSQL-resultaat-ID. Veldnummering begint vanaf 0.

pg_VeldNum

pg_FieldNum -- retourneert het kolomnummer
Beschrijving
int pg_fieldnum(int resultaat_id, string veldnaam);

pg_FieldNum() retourneert het kolomnummer dat overeenkomt met de opgegeven veldnaam in de opgegeven PosgreSQL-resultaat-ID. De nummering van de velden begint bij 0. Bij een fout retourneert de functie -1.

pg_FieldPrtLen

pg_FieldPrtLen -- Geeft de afdrukbare lengte terug
Beschrijving
int pg_fieldprtlen(int resultaat_id, int rijnummer, string veldnaam);

pg_FieldPrtLen() retourneert de werkelijke afdrukbare lengte (aantal tekens) van de opgegeven gegevens in het PosgreSQL-resultaat. De nummering van records begint vanaf 0. Als er een fout optreedt, retourneert de functie -1.

pg_Veldgrootte

pg_FieldSize -- retourneert de interne opslaggrootte van het genoemde veld
Beschrijving
int pg_fieldsize(int resultaat_id, string veldnaam);

pg_FieldSize() retourneert de interne opslaggrootte van het opgegeven benoemde veld in het opgegeven PosgreSQL-resultaat. Een veldgrootte van -1 duidt op een variabele veldlengte. Deze functie retourneert false bij een fout.

pg_FieldType

pg_FieldType -- retourneert het type van het corresponderende benoemde veld
Beschrijving
int pg_fieldtype(int resultaat_id, int veldnummer);

pg_FieldType() retourneert een tekenreeks met de typenaam van het opgegeven veld in de opgegeven PosgreSQL-resultaat-ID. Veldnummering begint vanaf 0.

pg_FreeResultaat

pg_FreeResult - maakt geheugen vrij
Beschrijving
int pg_freeresult(int resultaat_id);

pg_locreate

pg_locreate -- maakt een groot object
Beschrijving
int pg_locreate(int conn);

pg_locreate() Creëert een large object (ILO) mapping en retourneert de large object identifier. verbind bepaalt de juiste verbinding met de database. De PostgreSQL-toegangsmodi INV_READ, INV_WRITE en INV_ARCHIVE worden niet ondersteund; het object wordt altijd gemaakt voor zowel lezen als schrijven. INV_ARCHIVE is verwijderd uit PostgreSQL zelf (versies 6.3 en hoger).

pg_loopen

pg_loopen -- opent een groot object
Beschrijving
int pg_loopen(int conn, int objoid, stringmodus);

pg_loopen() Opent een grote objectweergave (ILO) en retourneert een bestandsingang naar het grote object. De bestandsdescriptor bevat informatie over de verbinding. Sluit de verbinding niet totdat de LOB-bestandsdescriptor is gesloten. objoid bepaalt de juiste LOB-ID en modus kan een van de volgende zijn: "r", "w" of "rw".

pg_loread

pg_loread - leest een groot object
Beschrijving
string pg_loread(int fd, int len);

pg_loread() leest len bytes van het grote object en retourneert deze als een tekenreeks. fd definieert een geldige LOB-bestandsdescriptor len definieert de maximaal mogelijke segmentgrootte van een groot object.

pg_loreadall

pg_loreadall - leest het hele grote object
Beschrijving
ongeldig pg_loreadall(int fd);

pg_loreadall() leest een groot object en stuurt dit, na alle benodigde headers, direct naar de browser. Wordt voornamelijk gebruikt voor het verzenden van binaire gegevens zoals afbeeldingen en geluidsbestanden.

pg_lounlink

pg_lounlink -- verwijdert een groot object
Beschrijving
void pg_lounlink(int conn, int lobjid);

pg_lounlink() verwijdert een groot object met een groot object-ID lobjid .

pg_lowrite

pg_lowrite -- schrijft naar een groot object
Beschrijving
int pg_lowrite(int fd, string buf);

pg_lowrite() schrijft gegevens vanuit een variabele naar een groot object buf en retourneert het aantal gegevens dat bij een fout is geschreven of onwaar is. fd is een grote objectbestandshandle van de functie.

pg_NumFields

pg_NumFields -- retourneert het aantal velden
Beschrijving
int pg_numfields(int resultaat_id);

pg_NumFields() retourneert het aantal velden (kolommen) in een PostgreSQL-resultaat. De parameter is de juiste resultaat-ID die door de functie wordt verkregen. Deze functie retourneert -1 bij een fout.

pg_NumRows

pg_NumRows -- retourneert het aantal records
Beschrijving
int pg_numrows(int resultaat_id);

De verbinding kan ook tot stand worden gebracht met het volgende commando: $conn = pg_pconnect("dbname=marliese port=5432"); Andere parameters behalve dbnaam En haven, - Dit gastheer , tty En opties .

pg_Poort

pg_Port -- retourneert het poortnummer
Beschrijving
int pg_port(int verbinding_id);

pg_Port() retourneert het poortnummer waarmee de opgegeven PostgreSQL-verbindings-ID is verbonden.

pg_Resultaat

pg_Result - retourneert gegevens van de resultaat-ID
Beschrijving
gemengd pg_result (int resultaat_id, int rij_nummer, gemengde veldnaam);

pg_Result() retourneert gegevens van de resultaat-ID ontvangen door . Opties rij nummer En veldnaam Bepaal uit welke tabelcel de gegevens worden gehaald. De nummering van records en velden begint vanaf 0. In plaats van de veldnaam kunt u het veldnummer gebruiken (zonder aanhalingstekens).

PostgreSQL heeft veel soorten gegevens, maar alleen de basisgegevens worden hier ondersteund. Allerlei typen gehele getallen, Booleaanse waarden en identificatietypen worden geretourneerd als gehele getallen. Alle soorten drijvende-komma- en reële getallen worden geretourneerd als type double. Alle andere typen, inclusief arrays, worden geretourneerd als tekenreeksen, op dezelfde manier opgemaakt als u in het programma zag psql.

pg_tty

pg_tty -- retourneert de tty-naam
Beschrijving
string pg_tty(int verbinding_id);

pg_tty() retourneert de tty-naam die de server aan de opgegeven PostgreSQL-verbindings-ID geeft.

pg_update (bron $verbinding , string $tabelnaam , array $gegevens , array $voorwaarde [, int $opties = PGSQL_DML_EXEC ])

pg_update() vervangt records in de tabel die aan de voorwaarden voldoen voorwaarde gegevens gegevens. Als er een argument wordt gegeven opties, zullen de gegevens door de functie worden getransformeerd pg_convert(), waaraan de parameters uit dit argument worden doorgegeven.

Lijst met parameters

PostgreSQL-databaseverbindingsbron.

Tafel naam

De naam van de tabel waarin de records worden bijgewerkt.

Array( reeks), waarvan de sleutels overeenkomen met de namen van de kolommen van de table_name-tabel, en de waarden zullen de gegevens in deze kolommen vervangen.

Voorwaarde

Array( reeks), waarvan de sleutels overeenkomen met de namen van de kolommen van de tabel tabelnaam . Alleen de rijen waarvan de veldwaarden overeenkomen met de arraywaarden worden bijgewerkt.

Opties

Eén van de constanten PGSQL_CONV_OPTS, PGSQL_DML_NO_CONV, PGSQL_DML_ESCAPE, PGSQL_DML_EXEC, PGSQL_DML_ASYNC of PGSQL_DML_STRING, of een combinatie daarvan. Als opties bevat PGSQL_DML_STRING, retourneert de functie een string. Indien geïnstalleerd PGSQL_DML_NO_CONV of PGSQL_DML_ESCAPE en vervolgens de functie pg_convert() niet intern gebeld.

Waarden retourneren

Geeft terug WAAR bij succesvolle afronding of ONWAAR in geval van een fout. De functie retourneert de string ( snaar), indien constant PGSQL_DML_STRING opgenomen in opties.

Voorbeelden

Voorbeeld #1 Gebruiksvoorbeeld pg_update()

$db = pg_connect("dbnaam=foo" );
$data = array("veld1" => "AA" , "veld2" => "BB" );

// Dit is veilig omdat $_POST automatisch wordt geconverteerd
$res = pg_update ($db, "post_log", $_POST, $data);
als ($res) (
echo "Gegevens bijgewerkt:$res\n" ;
) anders (
echo "Ongeldige gegevens moeten zijn verzonden\n";
}
?>