2012-09-18 6 views
6

Czasami wydaje się, że moje polecenia w psql nie mają żadnego efektu. Każdy pomysł, dlaczego?W psql, dlaczego niektóre polecenia nie mają żadnego efektu?

Poniższa lista wszystkich tabel w bazie danych library_development:

library_development => \ d

   List of relations 
Schema |  Name  | Type | Owner 
--------+-------------------+-------+---------- 
public | Pavan    | table | postgres 
public | schema_migrations | table | sai 
(2 rows) 

Potem rzuciłem tabelę Pavan użyciu:

library_development-> drop table Pavan 

Ale Tabela nie jest odrzucany, a jego pokazy, jak pokazano:

library_development=> \d 
       List of relations 
Schema |  Name  | Type | Owner 
--------+-------------------+-------+---------- 
public | Pavan    | table | postgres 
public | schema_migrations | table | sai 
(2 rows) 

również:

  1. Używam PostgreSQL w systemie Windows. Czy jest jakieś polecenie, aby wyczyścić konsolę (jak cl scr obecny w Oracle)?

  2. Czy istnieje pojęcie "commit", które muszę wykonać w Postgresql podczas pracy ze skryptami DML?

+0

Postaraj się zakończyć średnikiem 'tabeli spadek Pavan;' – edze

+0

Zamieszczając pytania jak to zazwyczaj jest to dobry pomysł, aby wymienić wersję PostgreSQL. +1 za to, że wyraźnie pokazuje, co się dzieje. –

Odpowiedz

14

Instrukcje kończą się średnikami.

W psql, naciśnięcie enter bez średnika kontynuuje instrukcję do następnego wiersza, dodając to, co napisałeś do bufora zapytania, zamiast go wykonywać. Zauważysz, że monit zmienia się z dbname=> na dbname->, aby wskazać, że jesteś w linii kontynuacji.

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

Wskazówki jak po naciśnięciu ENTER, nie średnikiem Prompt zmiany regress-# i nie zostaną podjęte działania. Nie ma tabeli sometable, więc jeśli instrukcja wystąpiłaby błąd zostanie zgłoszony.

Dalej, zobacz użycie \r w następnym wierszu? To wyczyści bufor zapytania. Zauważ, że po cofnięciu bufora monit zmienia się ponownie na regress=#, ponieważ nie ma już buforowania częściowego.

To pokazuje, jak wypowiedzi można podzielić całej linii:

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

Mylące jest to, że psql backslash poleceń jak \d są nowalinia zakończone, nie średnik zakończony, więc robią bieg po naciśnięciu klawisza enter . Jest to przydatne, gdy chcesz (powiedzmy) wyświetlić definicję tabeli podczas pisania instrukcji, ale jest to nieco mylące dla początkujących.

Jak na dodatkowe pytania:

  1. Jeśli istnieje komenda w psql dla Windows nie znalazłem go jeszcze „jasny ekran”. W Linuksie używam control-L, tak jak każdego innego programu używającego readline. W Windows może zadziała \! cls, ale nie próbowałem.

  2. DDL w PostgreSQL jest transakcyjna. Możesz wykonać transakcję BEGIN, wydać kilka transakcji DDL i COMMIT, aby transakcja zaczęła obowiązywać. Jeśli nie wykonasz DDL w transakcji jawnej, natychmiast wejdzie w życie.

+0

Dziękuję bardzo za jasne wyjaśnienie. – Pawan