0

我很难将外键应用于 postgres musicbrainz 数据库。
我使用这些出色的说明让我走到了这一步:
https://bitbucket.org/lalinsky/mbslave
我在 postgres 中加载了所有数据。
我创建了主键和索引。

但是,当我尝试应用外键时,我收到了这个奇怪的错误:

musicbrainz@ip-10-217-5-18:/home/ubuntu/mbslave$ psql < sql/CreateFKConstraints.sql 
ERROR:  insert or update on table "annotation" violates foreign key constraint "annotation_fk_editor"
DETAIL:  Key (editor)=(51298) is not present in table "editor".

SQL 脚本的第一行似乎出错了:

ALTER TABLE annotation
   ADD CONSTRAINT annotation_fk_editor
   FOREIGN KEY (editor)
   REFERENCES editor(id);

我是 postgres 的新手,很难理解这个错误信息。

第一行让我相信外键约束已经创建。但我不认为它有。

musicbrainz=> SELECT
musicbrainz->     tc.constraint_name, tc.table_name, kcu.column_name, 
musicbrainz->     ccu.table_name AS foreign_table_name,
musicbrainz->     ccu.column_name AS foreign_column_name 
musicbrainz-> FROM 
musicbrainz->     information_schema.table_constraints AS tc 
musicbrainz->     JOIN information_schema.key_column_usage AS kcu
musicbrainz->       ON tc.constraint_name = kcu.constraint_name
musicbrainz->     JOIN information_schema.constraint_column_usage AS ccu
musicbrainz->       ON ccu.constraint_name = tc.constraint_name
musicbrainz-> WHERE constraint_type = 'FOREIGN KEY' AND tc.table_name='annotation';
 constraint_name | table_name | column_name | foreign_table_name | foreign_column_name 
-----------------+------------+-------------+--------------------+---------------------
(0 rows)

错误消息中的第二行令人困惑。听起来好像在编辑器表中找不到 id 列。但它就在那里。

musicbrainz=> \d editor
                                      Table "musicbrainz.editor"
       Column        |           Type           |                      Modifiers                      
---------------------+--------------------------+-----------------------------------------------------
 id                  | integer                  | not null default nextval('editor_id_seq'::regclass)
 name                | character varying(64)    | not null
 privs               | integer                  | default 0
 email               | character varying(64)    | default NULL::character varying
 website             | character varying(255)   | default NULL::character varying
 bio                 | text                     | 
 member_since        | timestamp with time zone | default now()
 email_confirm_date  | timestamp with time zone | 
 last_login_date     | timestamp with time zone | default now()
 edits_accepted      | integer                  | default 0
 edits_rejected      | integer                  | default 0
 auto_edits_accepted | integer                  | default 0
 edits_failed        | integer                  | default 0
 last_updated        | timestamp with time zone | default now()
 birth_date          | date                     | 
 gender              | integer                  | 
 area                | integer                  | 
 password            | character varying(128)   | not null
 ha1                 | character(32)            | not null
 deleted             | boolean                  | not null default false
Indexes:
    "editor_pkey" PRIMARY KEY, btree (id)
    "editor_idx_name" UNIQUE, btree (lower(name::text))

建议?

4

1 回答 1

1

约束:

ALTER TABLE annotation
   ADD CONSTRAINT annotation_fk_editor
   FOREIGN KEY (editor)
   REFERENCES editor(id);

表示在表中,该表annotation中的列editor也必须存在于该表editor下的表中id

本质上,它确保所有editor id使用的 'sannotation都存在于数据库中。

这有助于保持参照完整性。如果没有外键约束,任何东西都可能存在,无论它是否真的在editor表中,这可能会导致一大堆与数据相关的问题。

错误信息:

错误:在表“注释”上插入或更新违反外键约束“annotation_fk_editor”详细信息:表“编辑器”中不存在键(编辑器)=(51298)。

表示表中不存在带有51298id的行。editor

该表中是否存在任何数据?

您可以annotations通过\d像对editor. (您可能需要\d+获取所有信息。)

此外,虽然我以前没有使用过MusicBrainz,但 BitBucket 链接包含两件对我来说很突出的事情,这可能会导致您的问题:

  1. 主页上的设置说明似乎没有应用 FK 约束
  2. 设置说明还使用了一个名为mbslave-remap-schema.py的Python包装器,该包装器正在对 SQL 文本进行一些类似sed的替换以更改周围的模式等,并将其输出通过管道传输到psql的包装器中直接命名为mbslave-psql.py而不是psql
  3. sql 文件似乎都与模式相关,并且数据本身似乎是使用不同的包装器从转储中导入的:(./mbslave-import.py mbdump.tar.bz2 mbdump-derived.tar.bz2显然没有整个数据库转储,或者至少没有一个显而易见的转储)
于 2014-08-29T01:00:46.297 回答