插入postgresql表时autoincrement id为null

时间:2014-06-19 14:23:29

标签: php postgresql symfony auto-increment

大家好先发帖在这里所以希望我已经做到了这一点我也是symfony ad postgresql的新手所以也许我做了一个愚蠢的错误:))

问题描述

我有一个包含地址信息的实体地址。我使用doctrine生成模式:schema:create(Database type Postgresql)

创建表并可在数据库中查看。我需要将信息导入此表,这是从一个开放的街道地图数据库中获取的。所以我试图插入我的实体表。我遇到的问题是我没有传递ID,因为它意味着自动增加,但数据库拒绝我的插入请求,因为id是一个空值。

我是symfony的新手,也是postgresql的新手,所以也许我犯了一个愚蠢的基本错误。我希望有一个人可以帮助我 (另一方面,这个项目最初是在mysql中,并且由于ID是自动增量而工作正常)

以下详细信息:


ENTITY YAML

DD\Bundle\DDGeneratorBundle\Entity\Address:

    type:  entity
    table: address
    readOnly: true
    repositoryClass: DD\Bundle\DDGeneratorBundle\Repository\AddressRepository

    id:
        id:
            type: integer
            generator:
                strategy: AUTO

    fields:
        number:
            type: string
            length: 255
        street:
            type: string
            length: 255
        city:
            type: string
            length: 255
        postcode:
            type: string
            length: 255
        latitude:
            type: decimal
            scale: 7
        longitude:
            type: decimal
            scale: 7

    indexes:
        coordinates:
            columns: [latitude, longitude]

    lifecycleCallbacks: {  }

由symfony生成的表

-- Table: address

-- DROP TABLE address;

CREATE TABLE address
(
  id integer NOT NULL,
  "number" character varying(255) NOT NULL,
  street character varying(255) NOT NULL,
  city character varying(255) NOT NULL,
  postcode character varying(255) NOT NULL,
  latitude numeric(10,7) NOT NULL,
  longitude numeric(10,7) NOT NULL,
  CONSTRAINT address_pkey PRIMARY KEY (id)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE address
  OWNER TO postgres;

-- Index: coordinates

-- DROP INDEX coordinates;

CREATE INDEX coordinates
  ON address
  USING btree
  (latitude, longitude);

插入SQL

insert into address ("number",street,city,postcode,latitude,longitude)
select *
from dblink('dbname=osm',
            '
SELECT tag_housenumber.v as number,
tag_street.v as street,
tag_city.v as city,
tag_postcode.v as postcode,
ST_Y(ST_Transform(nodes.geom, 4326)) AS latitude,
ST_X(ST_Transform(nodes.geom, 4326)) AS longitude


FROM ways

LEFT JOIN way_tags AS tag_housenumber ON tag_housenumber.way_id = ways.id
LEFT JOIN way_tags AS tag_street ON tag_street.way_id = ways.id
LEFT JOIN way_tags AS tag_city ON tag_city.way_id = ways.id
LEFT JOIN way_tags AS tag_postcode ON tag_postcode.way_id = ways.id
INNER JOIN way_nodes ON ways.id = way_nodes.way_id
INNER JOIN nodes on way_nodes.node_id = nodes.id

WHERE tag_housenumber.k = ''addr:housenumber''
AND tag_street.k = ''addr:street''
AND tag_city.k = ''addr:city''
AND tag_postcode.k = ''addr:postcode'' ')
       as t1("number" text,street text,city text,postcode text,latitude numeric(10,7),longitude numeric(10,7));

错误

以下是我从pgadmin3获得的错误,地址详细信息为X'd:

错误:列“id”中的空值违反了非空约束 详细信息:失败的行包含(null,X,XXXXXX,XXXX,XXXX,XXXX,XXXX)。 ****** 错误 ******

错误:列“id”中的空值违反了非空约束 SQL状态:23502 细节:失败的行包含(null,X,XXXXX,XXXXXX,XXXX,XXXX,XXXX)。

2 个答案:

答案 0 :(得分:0)

试试这个:

将实体yaml部分更改为:

id:
        id:
            type: integer
            id: true
            generator:
                strategy: AUTO

答案 1 :(得分:0)

<强>解决方案

问题是Symfony没有为id添加自动增量默认值。 Symfony似乎不需要这个,因为它单独请求获取新id所需的序列值。

我修改了我的yaml文件,以便symfony为id字段添加默认值。

显然,对于其他任何想要解决此问题的人,您需要更改默认值中的字符串值,以匹配在symfony中为您的实体生成的序列名称。

DD\Bundle\DDGeneratorBundle\Entity\Address:

    type:  entity
    table: dd_address
    readOnly: true
    repositoryClass: DD\Bundle\DDGeneratorBundle\Repository\AddressRepository

    id:
        id:
            type: integer
            id: true
            generator:
                strategy: AUTO
            options:
                default: nextval('dd_address_id_seq')

    fields:
        number:
            type: string
            length: 255
        street:
            type: string
            length: 255
        city:
            type: string
            length: 255
        postcode:
            type: string
            length: 255
        latitude:
            type: decimal
            scale: 7
        longitude:
            type: decimal
            scale: 7

    indexes:
        coordinates:
            columns: [latitude, longitude]

    lifecycleCallbacks: {  } 

希望这可以帮助处于相同情况的其他人

亲切的问候 大卫