以下を設定しています
CREATE TABLE auth_user ( id int PRIMARY KEY );
CREATE TABLE links_chatpicmessage ();
列を追加links_chatpicmessage
のsender
列と呼ばれる別のテーブルへの外部キーであるauth_user
に名前付きid
を追加しようとしています。
上記を達成するために、私は端末で次のことを試しています:
ALTER TABLE links_chatpicmessage
ADD FOREIGN KEY (sender)
REFERENCES auth_user;
しかし、これは私にエラーを与えます:
エラー:外部キー制約で参照されている列「送信者」が存在しません
どうすれば修正できますか?
列に制約を追加するには最初にテーブルに存在する必要があります 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);
Postgresでこれを1行で実行できます。
ALTER TABLE links_chatpicmessage ADD COLUMN sender INTEGER REFERENCES auth_user (id);
手動で名前を設定する必要はありません。 Postgresはこの制約に自動的に「links_chatpicmessage_auth_user_id_fkey」という名前を付けます。
私はこの答えがかなり遅れていることを知っています、そしてこれは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の送信者と同じタイプ]
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);
****既存の列の外部キー参照****
ALTER TABLE table_name制約の追加fkey_name外部キー(id)参照ref_table(id)