열을 외래 키로 추가하면 외래 키 제약 조건에서 참조 된 ERROR 열이 존재하지 않습니다.
다음 설정이 있습니다.
CREATE TABLE auth_user ( id int PRIMARY KEY );
CREATE TABLE links_chatpicmessage ();
내가하기 위해 노력하고있어 열 추가 이름 sender
에 links_chatpicmessage
있는 것은라는 다른 테이블에 외래 키 auth_user
의 id
열입니다.
위의 작업을 수행하기 위해 터미널에서 다음을 시도하고 있습니다.
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)
'IT TIP' 카테고리의 다른 글
Eloquent ORM laravel 5 ID 배열 가져 오기 (0) | 2020.12.02 |
---|---|
Laravel 5.2-Eloquent 테이블에 대한 사용자 지정 기본 키로 문자열 사용이 0이 됨 (0) | 2020.12.02 |
WPF 데이터 템플릿이 목록 상자의 전체 너비를 채우도록하려면 어떻게해야합니까? (0) | 2020.12.02 |
iPhone에서 네트워크 트래픽을 어떻게 모니터링합니까? (0) | 2020.12.02 |
TextBlock의 WPF 형식 DateTime? (0) | 2020.12.02 |