2015-10-04 33 views
0

我正在處理一個php腳本,它將數據編譯爲postgresql數據庫的插入語句。它最初是爲mysql數據庫編寫的,所以當然有一些差異。postgresql不喜歡多個逗號

有一件事我碰到,我似乎無法弄清楚,是PostgreSQL的不喜歡這種類型的語句:

INSERT INTO table (col1, col2, col3, col4) VALUES ('value',,'value','value'); 

任何有缺失值時,查詢在犯錯點的雙重逗號。

關於如何繞過這個任何想法?這些字段都有不同的數據類型,所以使用''作爲填充符會失敗,如果col期望int。

回答

3

PostgreSQL在這裏遵循SQL標準。你的陳述是無效的,所以它會產生一個錯誤。

您必須:

  • 動態生成列名列表,只包括你要設置列;或
  • 使用關鍵字DEFAULT說「做你會做,如果我沒有指定這個欄」

    INSERT INTO table (col1, col2, col3, col4) 
    VALUES ('value',DEFAULT,'value','value'); 
    

注意,DEFAULT關鍵字不引用了。它不是一個標識符或文字。這是一個關鍵字,必須不加引號。這意味着無法通過大多數參數化語句查詢接口將其作爲查詢參數傳遞。

這意味着無論哪種方式,您都會遇到動態SQL。

我認爲這是大多數SQL客戶端接口中的一個真正的缺陷,它應該提供一個通用對象,您可以通過它來指定「使此列成爲默認字段」或方法setDefault(paramname)或類似方法。不幸的是,這不會對你有所幫助,因爲他們大多數人不這樣做。

可以通過NULL作爲佔位符,如果列可以爲空,但這不是傳遞DEFAULT。如果您使用DEFAULT關鍵字,則使用該列上的任何DEFAULT表達式,就好像您根本沒有指定該列。如果使用NULL,則列定義上的任何DEFAULT表達式都將被覆蓋並被忽略。

+0

我覺得'NULL'會成爲我的選擇,但我遇到了另一個問題。如何判斷我讀的單元格是否空白。我試過'if($ cell ==''或$ cell =='')',但它沒有捕獲缺失的值。 – KingRichard

+0

NULL不是空字符串 - 不在ANSI SQL數據庫上。 –

+1

空字符串'',一個帶有單個空格的字符串''和NULL是不同的東西。你必須測試'column IS NULL'或'IS NOT NULL' - 你不能使用'= NULL'。有關原因,請參閱介紹性數據庫理論手冊或postgresql手冊。你還應該閱讀關於連接和規範化。 –