postgresql 외래 키 구문


122

아래 posgresql 코드에서 볼 수 있듯이 2 개의 테이블이 있습니다. 첫 번째 테이블 students에는 2 개의 열이 있습니다. 하나는 student_name 용이고 다른 하나는 기본 키인 student_id입니다. 내 두 번째 테이블 테스트에서 이것은 subject_id에 대한 하나, subject_name에 대한 하나, 그리고 가장 높은 과목에서 가장 높은 점수를 가진 학생에 대한 하나, 가장 높은 Student_id 인 4 개의 열을 가지고 있습니다. highStudent_id가 내 students 테이블의 student_id를 참조하도록 노력하고 있습니다. 이것은 아래에있는 코드이며 구문이 올바른지 확실하지 않습니다.

CREATE TABLE students ( student_id SERIAL PRIMARY KEY,
                 player_name TEXT);

CREATE TABLE tests ( subject_id SERIAL,
                   subject_name,
                   highestStudent_id SERIAL REFERENCES students);

구문이 highestStudent_id SERIAL REFERENCES students정확합니까? 나는 다른 것을 보았 기 때문에highestStudent_id REFERENCES students(student_id))

postgresql에서 외래 키를 만드는 올바른 방법은 무엇입니까?


4
예, 구문은 "올 바릅니다". 그러나 FK 컬럼한다 하지 로서 정의 될 serial그것은 다음과 같이 정의한다 integer. serial는 "실제"데이터 유형이 아니며 시퀀스에서 기본값을
채우기

FK가 기본 키를 참조하는 경우 열이 필요하지 않습니다. FK가 대체 키를 참조하는 경우 열이 필요합니다.
jarlh

1
외래 키는 "플레이어"테이블을 참조합니다. 당신은 나타나지 않습니다 "플레이어"라는 이름의 테이블을.
Mike Sherrill 'Cat

@Mike Sherrill '고양이 리콜 미안, 내 실수는 내가 가장 높은 것을 의미했다 .Student_id 정수 REFERENCES students
Hamza

답변:


249

이 테이블 가정 :

CREATE TABLE students 
( 
  student_id SERIAL PRIMARY KEY,
  player_name TEXT
);

외래 키를 정의하는 방법에는 네 가지가 있으며 (단일 열 PK를 처리 할 때) 모두 동일한 외래 키 제약 조건으로 이어집니다.

  1. 대상 열을 언급하지 않고 인라인 :

    CREATE TABLE tests 
    ( 
       subject_id SERIAL,
       subject_name text,
       highestStudent_id integer REFERENCES students
    );
  2. 대상 열을 언급하는 인라인 :

    CREATE TABLE tests 
    ( 
       subject_id SERIAL,
       subject_name text,
       highestStudent_id integer REFERENCES students (student_id)
    );
  3. 내부 줄을 벗어났습니다 create table.

    CREATE TABLE tests 
    ( 
      subject_id SERIAL,
      subject_name text,
      highestStudent_id integer, 
      constraint fk_tests_students
         foreign key (highestStudent_id) 
         REFERENCES students (student_id)
    );
  4. 별도의 alter table진술 :

    CREATE TABLE tests 
    ( 
      subject_id SERIAL,
      subject_name text,
      highestStudent_id integer
    );
    
    alter table tests 
        add constraint fk_tests_students
        foreign key (highestStudent_id) 
        REFERENCES students (student_id);

당신이 선호하는 것은 취향의 문제입니다. 그러나 스크립트에서는 일관성이 있어야합니다. 두 개 이상의 열로 구성된 PK를 참조하는 외래 키가있는 경우 마지막 두 문은 유일한 옵션입니다.이 경우 FK "인라인"을 정의 할 수 없습니다. 예 :foreign key (a,b) references foo (x,y)

Postgres에서 생성 된 시스템이 마음에 들지 않는 경우 버전 3) 및 4) 만 FK 제약 조건에 대해 고유 한 이름을 정의 할 수 있습니다.


serial데이터 형식은 정말 데이터 타입이다. 시퀀스에서 가져온 열의 기본값을 정의하는 간단한 표기법입니다. 그래서 모든 열 참조 로 정의 된 열에 serial해당 기본 타입을 사용하여 정의되어야한다 integer(또는 bigintbigserial열)


이 링크 ( postgresqltutorial.com/postgresql-foreign-key )는 3과 4의 'constraint'명령으로 만 수행 할 수 있다고 말한 다른 방법을 보여줍니다. 또한 FK 앞에 FOREIGN KEY를 두는 것은 어떻습니까? 그렇게하면 변수 유형을 선언 할 필요가없는 것 같습니다.
wordsforthewise
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.