1

我在“kladr_full_name”列中有 sql 错误空值违反了非空约束。

执行数据库中的表到 wich 请求:

С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' 

数据库 postgreSql。jpa省休眠。这可能是什么原因?

现在的问题是,如果某些子查询返回 null,如何修改此查询以在 postgres 中工作(在它在 oracle db 中工作之前)?

4

1 回答 1

3

在 PostgreSQL 中,如果它的任何一个a || b参数NULLNULL. 因此,如果这些子查询中的任何一个未能找到记录,您的INSERT语句将尝试插入NULL。您需要分别尝试这些子查询中的每一个,并查看哪个子查询没有给您记录(或给您一个记录)。kladr_full_nameNULL


编辑添加以响应 OP 评论:在 Oracle 中,没有零长度字符串的概念,因为它们被转换为NULL(因此,例如,'' = ''不是真的,而是'' IS NULL)。通常转换是单向的LENGTH('') IS NULL——但在||运算符的情况下,它会转换NULL回零长度字符串,'ab' || NULL || 'cd'例如'abcd'. PostgreSQL 不会自动进行这种转换,因为它确实区别于''NULL但您可以:

于 2012-10-18T14:07:00.840 回答