7

PRIMARY KEYである文字の可変(12)フィールドを持つテーブルがあります。このクエリを実行しました

SELECT * FROM bg WHERE bg_id ='470370111002'

テーブルから行を選択します。すべてが良さそうです。それから私は試します。

INSERT INTO csapp_center_bgs(bg_id,center_id) VALUES('470370111002',2)

次のような bg_id に外部キーがあります...

ALTER TABLE csapp_center_bgs
ADD CONSTRAINT csapp_center_bgs_bg_id_65c818f360c84dc5_fk_bg_bg_id
FOREIGN KEY (bg_id)
REFERENCES tiger.bg (bg_id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY DEFERRED;

ここに正確なエラーがあります...

    ERROR:  insert or update on table "csapp_center_bgs" violates foreign key constraint "csapp_center_bgs_bg_id_65c818f360c84dc5_fk_bg_bg_id"
DETAIL:  Key (bg_id)=(470370111002) is not present in table "bg".
********** Error **********

ERROR: insert or update on table "csapp_center_bgs" violates foreign key constraint "csapp_center_bgs_bg_id_65c818f360c84dc5_fk_bg_bg_id"
SQL state: 23503
Detail: Key (bg_id)=(470370111002) is not present in table "bg".

なぜこれがうまくいかなかったのですか?何か案は?ここに \d+ bg...

  Column  |         Type          |                    Modifiers                     | Storage  | Stats target | Description 
----------+-----------------------+--------------------------------------------------+----------+--------------+-------------
 gid      | integer               | not null default nextval('bg_gid_seq'::regclass) | plain    |              | 
 statefp  | character varying(2)  |                                                  | extended |              | 
 countyfp | character varying(3)  |                                                  | extended |              | 
 tractce  | character varying(6)  |                                                  | extended |              | 
 blkgrpce | character varying(1)  |                                                  | extended |              | 
 bg_id    | character varying(12) | not null                                         | extended |              | 
 namelsad | character varying(13) |                                                  | extended |              | 
 mtfcc    | character varying(5)  |                                                  | extended |              | 
 funcstat | character varying(1)  |                                                  | extended |              | 
 aland    | double precision      |                                                  | plain    |              | 
 awater   | double precision      |                                                  | plain    |              | 
 intptlat | character varying(11) |                                                  | extended |              | 
 intptlon | character varying(12) |                                                  | extended |              | 
 the_geom | geometry              |                                                  | main     |              | 
Indexes:
    "bg_pkey" PRIMARY KEY, btree (bg_id)
    "idx_bg_geom" gist (the_geom) CLUSTER
Check constraints:
    "enforce_dims_geom" CHECK (st_ndims(the_geom) = 2)
    "enforce_geotype_geom" CHECK (geometrytype(the_geom) = 'MULTIPOLYGON'::text OR the_geom IS NULL)
    "enforce_srid_geom" CHECK (st_srid(the_geom) = 4269)
Referenced by:
    TABLE "csapp_center_bgs" CONSTRAINT "csapp_center_bgs_bg_id_65c818f360c84dc5_fk_bg_bg_id" FOREIGN KEY (bg_id) REFERENCES bg(bg_id) DEFERRABLE INITIALLY DEFERRED
Child tables: tiger_data.tn_bg
Has OIDs: no

そして、ここに csapp_ の \d+ があります...

  Column   |         Type          |                           Modifiers                           | Storage  | Stats target | Description 
-----------+-----------------------+---------------------------------------------------------------+----------+--------------+-------------
 id        | integer               | not null default nextval('csapp_center_bgs_id_seq'::regclass) | plain    |              | 
 bg_id     | character varying(12) | not null                                                      | extended |              | 
 center_id | integer               | not null                                                      | plain    |              | 
Indexes:
    "csapp_center_bgs_pkey" PRIMARY KEY, btree (id)
    "csapp_center_bgs_5e94e25f" btree (bg_id)
    "csapp_center_bgs_c63f1184" btree (center_id)
Foreign-key constraints:
    "csapp_center_bgs_bg_id_65c818f360c84dc5_fk_bg_bg_id" FOREIGN KEY (bg_id) REFERENCES bg(bg_id) DEFERRABLE INITIALLY DEFERRED
    "csapp_center_bgs_center_id_360e6806f7d3fee_fk_csapp_centers_id" FOREIGN KEY (center_id) REFERENCES csapp_centers(id) DEFERRABLE INITIALLY DEFERRED
Has OIDs: no

バージョンは次のとおりです。

                                               version                                                
------------------------------------------------------------------------------------------------------
 PostgreSQL 9.3.5 on x86_64-unknown-linux-gnu, compiled by gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2, 64-bit

そして、ここに私の検索パスがあります....

search_path  
---------------
 public, tiger
(1 row)

bg はスキーマ tiger にあり、csapp_center_bgs はスキーマ public にあります...

4

1 に答える 1

7

私の最初の推測では、という名前の 2 つの異なるテーブルを扱っていると思いますbg。1つはスキーマtigerにあり、もう1つは非公開のスキーマにあり、あなたの前tigerに来ますsearch_path-またはトラはまったくありませんsearch_path

bg現在のデータベース内のすべてのスキーマで名前が付けられた (大文字と小文字を区別する) すべてのテーブルを検索します。

SELECT * FROM pg_tables WHERE tablename = 'bg';

設定を理解するにはsearch_path:

Postgres DB クラスターの構造を理解するには:

そうでない場合は、インデックスが破損している可能性があります。私は最初に試してみますREINDEX

REINDEX bg_pkey;

継承!

追加されたテーブル定義に次のように表示されます。

Child tables: tiger_data.tn_bg

bg_id ='470370111002'の行が実際に子テーブル に存在するのではないかと疑っていますtiger_data.tn_bg。しかし、あなたの FK 制約は親テーブルを参照しています。FK 制約は継承されません。
クエリを実行すると何が得られますか:

SELECT * FROM ONLY bg WHERE bg_id ='470370111002'

私の仮説が成り立つ場合、no rowが得られます。マニュアルの継承ページにある警告の章を読んでください。

関連している:

于 2015-01-10T22:47:57.550 に答える