2012-10-18 76 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帮助我很多 –

相关问题