web-dev-qa-db-ja.com

外部キーとして列を追加すると、外部キー制約で参照されるERROR列が存在しない

以下を設定しています

CREATE TABLE auth_user ( id int PRIMARY KEY );
CREATE TABLE links_chatpicmessage ();

列を追加links_chatpicmessagesender列と呼ばれる別のテーブルへの外部キーであるauth_userに名前付きidを追加しようとしています。

上記を達成するために、私は端末で次のことを試しています:

ALTER TABLE links_chatpicmessage
  ADD FOREIGN KEY (sender)
  REFERENCES auth_user;

しかし、これは私にエラーを与えます:

エラー:外部キー制約で参照されている列「送信者」が存在しません

どうすれば修正できますか?

56
Hassan Baig

列に制約を追加するには最初にテーブルに存在する必要があります postgresqlには、列を追加すると同時に制約を追加するために使用できるコマンドはありません。 2つの別個のコマンドでなければなりません。 次のコマンドを使用して実行できます。

まず次のようにします:

ALTER TABLE links_chatpicmessage ADD COLUMN sender INTEGER;

ここではタイプとしてintegerを使用していますが、auth_userテーブルのid列と同じタイプでなければなりません。

次に、制約を追加します

ALTER TABLE links_chatpicmessage 
   ADD CONSTRAINT fk_someName
   FOREIGN KEY (sender) 
   REFERENCES auth_user(column_referenced_name);

このコマンドのADD CONSTRAINT fk_someNameの部分は命名制約なので、モデルを作成するツールを使用してドキュメントを作成する必要がある場合は、ランダムな名前ではなく名前付きの制約を使用します。

また、管理者の目的にも役立つため、DBAは制約がそのテーブルからのものであることを認識します。

通常、それはあなたのケースでそれがどこから来たのかについてのヒントでfk_links_chatpicmessage_auth_userになるだろうという名前を付けますので、この名前を見た人は誰でもこの制約が何であるかを正確に知ることができます。

編集

@btubbsの答えで述べたように、実際には1つのコマンドで制約付きの列を追加できます。そのようです:

alter table links_chatpicmessage 
      add column sender integer, 
      add constraint fk_test 
      foreign key (sender) 
      references auth_user (id);
88
Jorge Campos

Postgresでこれを1行で実行できます。

ALTER TABLE links_chatpicmessage ADD COLUMN sender INTEGER REFERENCES auth_user (id);

手動で名前を設定する必要はありません。 Postgresはこの制約に自動的に「links_chatpicmessage_auth_user_id_fkey」という名前を付けます。

62
btubbs

私はこの答えがかなり遅れていることを知っています、そしてこれはbtubbs one-linerと同じであり、もう少し説明的であることを理解しています...

テーブルauth_userの主キーを参照し、そのキー名が「id」であると仮定します。

私はこの構文を使用します:

ALTER TABLE links_chatpicmessage 
ADD COLUMN sender some_type,
ADD FOREIGN KEY (sender) REFERENCES auth_user(id);

注:some_type = [テーブルauth_userの送信者と同じタイプ]

7
Ted Spradley

CONSTRAINT句はオプションです。それを省略し、常にPostgreSQLに制約の自動名前付けをさせることをお勧めします。名前を付けずに論理名を取得します

"links_chatpicmessage_sender_fkey" FOREIGN KEY (sender) REFERENCES auth_user(id)

おそらく、INSERTまたはUPDATEが制約違反のために失敗したかどうかを知りたいと思うでしょう。

外部キーを追加する構文

これらはすべて ALTER TABLE で多少文書化されています

新しいコラムへ

ALTER TABLE links_chatpicmessage 
  ADD COLUMN sender int,
  ADD [CONSTRAINT foo] FOREIGN KEY (sender) REFERENCES auth_user(id);

これは複合的なトランザクションです。 2つのステートメントを,で区切ることにより、同じテーブルで2つのALTERステートメントを発行できます。

既存の列へ

-- assumes someone has already added the column or that it already exists
ALTER TABLE links_chatpicmessage
  ADD COLUMN sender int;

ALTER TABLE links_chatpicmessage
  ADD [CONSTRAINT foo] FOREIGN KEY (sender) REFERENCES auth_user(id);
3
Evan Carroll

****既存の列の外部キー参照****

ALTER TABLE table_name制約の追加fkey_name外部キー(id)参照ref_table(id)

0
Jagadeesha N