2012-09-18 110 views
6

有時我在psql的命令似乎沒有效果。任何想法爲什麼?在psql中,爲什麼有些命令不起作用?

的下面是在數據庫中library_development所有表的列表:

library_development => \ d

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

此後,我使用刪除的表Pavan

library_development-> drop table Pavan 

但表中沒有下降,其顯示如圖所示

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

另外:

  1. 我在Windows中使用PostgreSQL。是否有任何命令清除控制檯(如在Oracle中的cl scr)?

  2. 在使用DML腳本時,我需要在Postgresql中執行「提交」的任何概念嗎?

+0

嘗試用分號「Drop table Pavan」來完成;' – edze

+0

當發佈類似這樣的問題時,提到PostgreSQL版本通常是個好主意。不過,爲了清楚地顯示發生了什麼,還需+1。 –

回答

14

以分號結尾的語句。

psql中,按enter鍵不加分號,將語句繼續到下一行,將您寫入的內容添加到查詢緩衝區而不是執行它。您會注意到提示從dbname=>更改爲dbname->,表示您處於延續線上。

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

注意如何在我按下Enter鍵沒有分號,以regress-#迅速變化和不採取行動。沒有表sometable,所以如果聲明已經運行,則會報告錯誤。

接下來,請參見下一行使用\r?這會清除查詢緩衝區。請注意,當清除緩衝區時,提示符會更改回regress=#,因爲不再存在部分語句緩衝區。

這顯示瞭如何語句可以跨行拆分:

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

混亂的事情是,psql反斜線命令,如\d是換行符終止,沒有分號結束,所以當你按下輸入他們運行。當你想在寫一個語句的時候(比如說)查看一個表的定義時,這很方便,但是對於新手來說這有點令人困惑。

至於你的其他問題:

  1. 如果有在psql「清屏」命令的Windows我還沒有找到它。在Linux上,我只使用control-L,和其他使用readline的程序一樣。在Windows中,也許\! cls將工作,但我沒有嘗試過。

  2. PostgreSQL中的DDL是事務性的。您可以通過BEGIN交易,發行一些DDL和COMMIT交易使其生效。如果您不在明確的事務中執行DDL,則立即生效。

+0

非常感謝您的明確解釋。 – Pawan

相關問題