IT TIP

열을 외래 키로 추가하면 외래 키 제약 조건에서 참조 된 ERROR 열이 존재하지 않습니다.

itqueen 2020. 12. 2. 22:22
반응형

열을 외래 키로 추가하면 외래 키 제약 조건에서 참조 된 ERROR 열이 존재하지 않습니다.


다음 설정이 있습니다.

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

내가하기 위해 노력하고있어 열 추가 이름 senderlinks_chatpicmessage있는 것은라는 다른 테이블에 외래 키 auth_userid열입니다.

위의 작업을 수행하기 위해 터미널에서 다음을 시도하고 있습니다.

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

그러나 이것은 나에게 오류를 준다.

오류 : 외래 키 제약 조건에서 참조 된 "sender"열이 없습니다.

이 문제를 어떻게 해결합니까?


열에 제약 조건을 추가하려면 먼저 테이블에 존재해야합니다 . Postgresql에는 열을 추가하고 제약 조건을 동시에 추가하는 데 사용할 수있는 명령이 없습니다. 두 개의 개별 명령이어야합니다. 다음 명령을 사용하여 수행 할 수 있습니다.

먼저 다음과 같이하십시오.

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에서 복잡한 쿼리를 수행하여 알아낼 수 없습니다.

편집하다

@btubbs의 답변에서 언급했듯이 실제로 하나의 명령에 제약 조건이있는 열을 추가 할 수 있습니다. 이렇게 :

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

Postgres에서 한 줄로이 작업을 수행 할 수 있습니다.

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

To a new column

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

This is compound and transactional. You can issue two ALTER statements on the same table by separating the two statements with a ,.

To a preexisting column

-- 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);

****foreign key reference for existing column****

ALTER TABLE table_name ADD CONSTRAINT fkey_name FOREIGN KEY (id) REFERENCES ref_table(id)

참고URL : https://stackoverflow.com/questions/35676149/adding-a-column-as-a-foreign-key-gives-error-column-referenced-in-foreign-key-co

반응형