1. ホーム
  2. database

[解決済み] 外部キーとしてカラムを追加すると、外部キー制約で参照されるカラムが存在しないERRORが表示される

2022-12-09 17:05:57

質問

以下のような設定をしています。

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

私が試みているのは カラムを追加する という名前の senderlinks_chatpicmessage という別のテーブルへの外部キーである auth_user 's id カラムになります。

上記を実現するために、ターミナルで以下を試しています。

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

しかし、これではエラーになります。

ERROR: 外部キー制約で参照される列 "sender" が存在しません。 存在しません。

これを修正するにはどうすればよいですか?

どのように解決するのですか?

カラムに制約を追加するには、まずテーブルの中に を追加すると同時に制約を追加するようなコマンドは、Postgresql にはありません。それは2つの別々のコマンドでなければなりません。 以下のコマンドを使用することができます。

まず、asを実行します。

ALTER TABLE links_chatpicmessage ADD COLUMN sender INTEGER;

私は integer を型として使っていますが、本来は id のカラムと同じ型でなければなりません。 auth_user テーブルの

次に、制約を追加します。

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 この名前を見た人は、INFORMATION_SCHEMAで複雑なクエリを実行しなくても、この制約が何であるかを正確に知ることができます。

EDIT

btubbsの回答で言及されているように、実際には1つのコマンドで制約を持つ列を追加することができます。このように。

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