sql >> Database >  >> RDS >> PostgreSQL

Waarom hebben sommige commando's in psql geen effect?

Verklaringen eindigen met puntkomma's.

In psql , door op enter te drukken zonder een puntkomma gaat de instructie verder naar de volgende regel, waarbij u toevoegt wat u hebt geschreven aan de querybuffer in plaats van het uit te voeren. U zult merken dat de prompt verandert van dbname=> naar dbname-> om aan te geven dat u op een vervolglijn zit.

regress=> DROP TABLE sometable
regress-> \r
Query buffer reset (cleared).
regress=> DROP TABLE sometable;
ERROR:  table "sometable" does not exist
regress=> 

Merk op hoe nadat ik op enter heb gedrukt zonder een puntkomma, de prompt verandert in regress-# en er wordt geen actie ondernomen. Er is geen tabel sometable , dus als de instructie was uitgevoerd, zou er een fout worden gerapporteerd.

Zie vervolgens het gebruik van \r op de volgende regel? Dat wist de querybuffer. Merk op dat de prompt weer verandert in regress=# wanneer de buffer wordt gewist, omdat er geen gedeeltelijke instructie meer wordt gebufferd.

Dit laat zien hoe uitspraken over regels kunnen worden verdeeld:

regress=> DROP TABLE
regress-> sometable
regress-> ;
ERROR:  table "sometable" does not exist

Het verwarrende is dat psql backslash-opdrachten zoals \d worden beëindigd met een nieuwe regel, niet met puntkomma's, dus doen ze uitvoeren wanneer u op enter drukt. Dat is handig als je (bijvoorbeeld) een tabeldefinitie wilt bekijken terwijl je een statement schrijft, maar het is een beetje verwarrend voor nieuwkomers.

Wat betreft uw aanvullende vragen:

  1. Als er een "clear screen"-opdracht is in psql voor Windows heb ik het nog niet gevonden. Op Linux gebruik ik gewoon control-L, hetzelfde als elk ander readline-gebruikend programma. In Windows \! cls zal werken.

  2. DDL in PostgreSQL is transactioneel. U kunt BEGIN een transactie, geef wat DDL uit en COMMIT de transactie om deze van kracht te laten worden. Als u uw DDL niet in een expliciete transactie doet, wordt deze onmiddellijk van kracht.



  1. WEEKOFYEAR() Voorbeelden – MySQL

  2. postgres hernoemen database werkt niet

  3. MySQL:ALTER IGNORE TABLE geeft schending van integriteitsbeperking

  4. Interval converteren naar minuten