2012-10-18 77 views
1

我有SQL錯誤空列值「kladr_full_name」中的空值違反了非空約束。在數據庫中至極請求列中的空值違反非空約束

表執行:

СREATE TABLE kladr.kladr_name 
(
    kladr_code character varying(255) NOT NULL, 
    kladr_city_name character varying(121), 
    kladr_full_name character varying(487) NOT NULL, 
    kladr_index character varying(6), 
    kladr_name character varying(100) NOT NULL, 
    kladr_naspunkt_name character varying(121), 
    kladr_rayon_name character varying(121), 
    kladr_region_name character varying(121), 
    kladr_socr character varying(20), 
    CONSTRAINT kladr_name_pkey PRIMARY KEY (kladr_code) 
) 
WITH (
    OIDS=FALSE 
); 
ALTER TABLE kladr.kladr_name 
    OWNER TO postgres; 

請求分貝:

INSERT INTO kladr.kladr_name 
      (kladr_code, 
      kladr_name, 
      kladr_socr, 
      kladr_index, 
      kladr_region_name, 
      kladr_rayon_name, 
      kladr_city_name, 
      kladr_naspunkt_name, 
      kladr_full_name) 
SELECT kladr_code, 
     Upper(kladr_name)     kladr_name, 
     kladr_socr, 
     kladr_index, 
     (SELECT k1.kladr_socr 
       ||' ' 
       ||k1.kladr_name 
     FROM kladr.kladr_tmp k1 
     WHERE k1.kladr_region = k.kladr_region 
       AND k1.kladr_rayon = '000' 
       AND k1.kladr_city = '000' 
       AND k1.kladr_nas_punkt = '000' 
       AND k1.kladr_mod = '00' 
       AND k1.kladr_status = '0')kladr_region_name, 
     (SELECT k1.kladr_socr 
       ||' ' 
       ||k1.kladr_name 
     FROM kladr.kladr_tmp k1 
     WHERE k1.kladr_region = k.kladr_region 
       AND k1.kladr_rayon = k.kladr_rayon 
       AND k1.kladr_rayon <> '000' 
       AND k1.kladr_city = '000' 
       AND k1.kladr_nas_punkt = '000' 
       AND k1.kladr_name = '00') kladr_rayon_name, 
     (SELECT k1.kladr_socr 
       ||' ' 
       ||k1.kladr_name 
     FROM kladr.kladr_tmp k1 
     WHERE k1.kladr_region = k.kladr_region 
       AND k1.kladr_rayon = k.kladr_rayon 
       AND k1.kladr_city = k.kladr_city 
       AND k1.kladr_city <> '000' 
       AND k1.kladr_nas_punkt = '000' 
       AND k1.kladr_mod = '00') kladr_city_name, 
     (SELECT k1.kladr_socr 
       ||' ' 
       ||k1.kladr_name 
     FROM kladr.kladr_tmp k1 
     WHERE k1.kladr_region = k.kladr_region 
       AND k1.kladr_rayon = k.kladr_rayon 
       AND k1.kladr_city = k.kladr_city 
       AND k1.kladr_nas_punkt = k.kladr_nas_punkt 
       AND k1.kladr_nas_punkt <> '000' 
       AND k1.kladr_mod = '00') kladr_naspunkt_name, 
     (SELECT k1.kladr_socr 
       ||' ' 
       ||k1.kladr_name 
     FROM kladr.kladr_tmp k1 
     WHERE k1.kladr_region = k.kladr_region 
       AND k1.kladr_rayon = '000' 
       AND k1.kladr_city = '000' 
       AND k1.kladr_nas_punkt = '000' 
       AND k1.kladr_mod = '00' 
       AND k1.kladr_status = '0') 
     ||' ' 
     ||(SELECT k1.kladr_socr 
       ||' ' 
       ||k1.kladr_name 
      FROM kladr.kladr_tmp k1 
      WHERE k1.kladr_region = k.kladr_region 
       AND k1.kladr_rayon = k.kladr_rayon 
       AND k1.kladr_rayon <> '000' 
       AND k1.kladr_city = '000' 
       AND k1.kladr_nas_punkt = '000' 
       AND k1.kladr_mod = '00') 
     ||' ' 
     ||(SELECT k1.kladr_socr 
       ||' ' 
       ||k1.kladr_name 
      FROM kladr.kladr_tmp k1 
      WHERE k1.kladr_region = k.kladr_region 
       AND k1.kladr_rayon = k.kladr_rayon 
       AND k1.kladr_city = k.kladr_city 
       AND k1.kladr_city <> '000' 
       AND k1.kladr_nas_punkt = '000' 
       AND k1.kladr_mod = '00') 
     ||' ' 
     ||(SELECT k1.kladr_socr 
       ||' ' 
       ||k1.kladr_name 
      FROM kladr.kladr_tmp k1 
      WHERE k1.kladr_region = k.kladr_region 
       AND k1.kladr_rayon = k.kladr_rayon 
       AND k1.kladr_city = k.kladr_city 
       AND k1.kladr_nas_punkt = k.kladr_nas_punkt 
       AND k1.kladr_nas_punkt <> '000' 
       AND k1.kladr_mod = '00')kladr_full_name 
FROM kladr.kladr_tmp k 
WHERE k.kladr_mod = '00' 

DB的PostgreSQL。 jpa提供休眠。這可能是什麼原因?

現在的問題是如何修改這個查詢在Postgres中工作(在Oracle數據庫中工作之前)如果一些subquerys返回null?

+3

也許你的子查詢'select'沒有返回任何行? – GriffeyDog

+0

這個查詢返回什麼? SELECT k1.kladr_socr ||' ' || k1.kladr_name FROM kladr.kladr_tmp K1 WHERE k1.kladr_region = k.kladr_region AND k1.kladr_rayon = k.kladr_rayon AND k1.kladr_city = k.kladr_city AND k1.kladr_nas_punkt = k.kladr_nas_punkt AND k1.kladr_nas_punkt <>'000' AND k1.kladr_mod ='00' – jazzytomato

+0

如果我在pgAdmin中發出這個請求,即使選擇沒有返回任何行,它也可以正常工作,但是當hibernate執行請求時,它會提示這個錯誤。 –

回答

3

在PostgreSQL中,表達式a || b的表達式將計算爲NULL,前提是其任一參數爲NULL。因此,如果這些子查詢的任何無法找到記錄,則您的INSERT語句將嘗試將NULL插入到kladr_full_name中。您需要分別嘗試每個子查詢,並查看哪一個不會給您一個記錄(或者正在向您提供一條記錄(NULL))。


編輯補充響應OP評論:在Oracle中,沒有零長度字符串的概念,因爲它們轉化爲NULL(因此,例如,'' = ''是不正確的,而'' IS NULL是)。通常轉換是單向的— LENGTH('') IS NULL —但在||運算符的情況下,它將NULL轉換回零長度字符串,因此'ab' || NULL || 'cd''abcd'。 PostgreSQL並不自動執行此轉換,因爲它NULL區分'',但你可以:

+0

是的,你說得對。但是這個查詢在oracle中完美工作。如何修改它以相同的結果在postgres中工作? –

+0

@KirillBazarov:你可以使用'COALESCE'或'CONCAT'。我已經更新了我的解釋。 – ruakh

+0

CONCAT幫助我很多 –

相關問題