phpMyAdmin에서 외래 키를 설정 하시겠습니까?


336

phpMyAdmin을 사용하여 데이터베이스를 설정하고 있습니다. 기본 키에 인덱스 된 두 개의 테이블 ( foobar)이 있습니다. 기본 키를 외래 키로 사용하여 관계형 테이블 ( ) 을 만들려고 합니다.foo_bar

이 테이블을 MyISAM으로 만들었지 만 MyISAM이 외래 키를 지원하지 않는다는 점을 읽었으므로 3 개 모두를 InnoDB로 변경했습니다. 모든 id필드는 INT(11)입니다.

나는 선택하면 foo_bar테이블의 "관계보기"링크를 클릭하고 FK 컬럼으로 설정하려고 database.foo.id하고 database.bar.id그것이 말하는, "인덱스가 정의되지!" 각 열 옆에

내가 무엇을 놓치고 있습니까?

설명 / 업데이트

간단하게하기 위해 phpMyAdmin을 계속 사용하고 싶습니다. 현재 XAMPP를 사용하고 있는데, 이는 PHP / CSS / Javascript에 집중할 수있을 정도로 쉬우 며 phpMyAdmin과 함께 제공됩니다.

또한 명시 적 외래 키를 아직 설정할 수 없지만 관계형 테이블이 있으며 다음과 같이 조인을 수행 할 수 있습니다.

SELECT * 
FROM foo 
INNER JOIN foo_bar 
ON foo.id = foo_bar.foo_id 
INNER JOIN bar
ON foo_bar.bar_id = bar.id;

데이터베이스에 FK가 명시 적으로 정의되어 있지 않은 것이 불편합니다.

답변:


366

phpMyAdmin을 사용하여 관계를 설정하려면 두 가지 작업을 수행해야합니다. 우선, 참조 테이블의 외래 키 열에 인덱스를 정의해야합니다 (따라서 foo_bar.foo_id). 그런 다음, 참조 테이블에서 관계보기로 이동하여 참조 된 열 (이 경우 foo.id)과 업데이트시 및 삭제 조치를 선택하십시오.

외래 키는 서로 연결된 여러 테이블이있는 경우 유용하며 특히 참조 옵션을 올바르게 설정하면 삭제 스크립트가 매우 짧아집니다.

편집 : 두 테이블 모두 InnoDB 엔진을 선택했는지 확인하십시오.


93
팁 : 제가 처음에 그것을 발견하기가 어려운 관계 뷰가 작은 링크가 테이블 아래에 있었다
믈라덴 Janjetovic

14
해당 링크가 표시되지 않는 경우 :이 경우 테이블이 InnoDB 유형 (phpMyAdmin의 작업 탭 아래)인지 확인하십시오.
muttley91

4
내 테이블은 InnoDB입니다. 나는 다시 확인했다. 링크가 여전히 표시되지 않습니다.
afilina

6
@afilina phpMyAdmin의 새 버전에서는 "Browse", "Structure"등을 표시하는 탭 행 바로 아래의 "Structure"탭 상단에 표시됩니다.
Astitva Srivastava

226

phpMyAdmin을 사용하면 "관계"보기를 사용하여 외래 키를 정의 할 수 있습니다. 그러나 MySQL은 "INNO DB"테이블에 대한 외래 제약 조건 만 지원하기 때문에 첫 번째 단계는 사용중인 테이블이 해당 유형인지 확인하는 것입니다.

CHILD 테이블의 PID 열이 PARENT 테이블의 ID 열을 참조하도록 외래 키를 설정하려면 다음을 수행하십시오.

  1. 두 테이블 모두 작업 탭으로 이동하여 유형을 "INNO DB"로 변경하십시오.
  2. ID가 PARENT 테이블의 기본 키 (또는 적어도 색인화 된 열)인지 확인하십시오.
  3. CHILD 테이블에서 PID 컬럼의 인덱스를 정의하십시오.
  4. CHILD 테이블의 구조 탭을 보면서 "필드 추가"섹션 바로 위에있는 "관계보기"링크를 클릭하십시오.
  5. 각 행이 CLIENT 테이블의 색인화 된 열에 해당하는 테이블이 제공됩니다. 각 행의 첫 번째 드롭 다운을 통해 인덱스 된 열이 참조하는 TABLE-> COLUMN을 선택할 수 있습니다. PID 행의 드롭 다운에서 PARENT-> ID를 선택하고 GO를 클릭하십시오.

CHILD 테이블에서 내보내기를 수행하면 PID 열에 대한 외래 키 제약 조건이 생성 된 것을 볼 수 있습니다.


2
와우, 알아야 할 매우 중요한 것. 이 페이지는 외래 키 추가와 관련하여 도움을 찾을 때 처음 찾은 것이 아니 었습니다.
user1299656

87

Wikipedia 기사의 요약입니다. PHPmyadmin에서 지정할 수있는 다양한 유형의 관계를 지정합니다. "업데이트 / 삭제시"에 대한 외래 키 옵션 설정에 대한 @Nathan의 의견과 관련이 있기 때문에 여기에 넣고 있지만 의견에는 너무 큽니다. 도움이되기를 바랍니다.

종속

마스터 (참조) 테이블의 행이 삭제 (각각 업데이트) 될 때마다 일치하는 외래 키 열이있는 자식 (참조) 테이블의 각 행도 삭제 (각각 업데이트)됩니다. 이를 연속 삭제 (resp. update [2])라고합니다.

얽매다

참조 된 테이블의 값을 참조하는 외래 키 테이블에 행이 존재하면 값을 업데이트하거나 삭제할 수 없습니다. 마찬가지로 외래 키 테이블에서 참조가있는 한 행을 삭제할 수 없습니다.

조치 없음

NO ACTION과 RESTRICT는 매우 비슷합니다. NO ACTION과 RESTRICT의 주요 차이점은 NO ACTION을 사용하면 테이블을 변경하려고 시도한 후 참조 무결성 검사가 수행된다는 것입니다. RESTRICT는 UPDATE 또는 DELETE 문을 실행하기 전에 점검을 수행합니다. 참조 무결성 검사에 실패하면 두 참조 조치 모두 동일하게 작동합니다. UPDATE 또는 DELETE 문은 오류를 발생시킵니다.

NULL 설정

참조 행의 외래 키 값은 참조 행이 업데이트되거나 삭제 될 때 NULL로 설정됩니다. 이는 참조 테이블의 각 열이 널 입력 가능한 경우에만 가능합니다. NULL의 의미로 인해 외래 키 열에 NULL이있는 참조 행에는 참조 행이 필요하지 않습니다.

기본값으로 설정

SET NULL과 유사하게 참조 행의 외래 키 값은 참조 행이 업데이트되거나 삭제 될 때 열 기본값으로 설정됩니다.


1
더 나은 아직, MySQL의 소스 문서로 직접 이동 : dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html
kmoser

63

phpmyadmin에서 GUI로 간단히 외래 키를 할당 할 수 있습니다. 테이블을 클릭하고 구조 탭으로 이동하십시오. 아래 그림에서 아래 표와 같이 관계보기를 찾으십시오.

여기에 이미지 설명을 입력하십시오

기본 키 옆에있는 목록 상자에서 단조 키를 할당 할 수 있습니다 (아래 이미지 참조). 저장

여기에 이미지 설명을 입력하십시오

해당 SQL 쿼리가 자동으로 생성되어 실행됩니다.


17

데이터베이스에 익숙하지 않은 사용자에게는 .... 기존 테이블을 변경해야합니다. 많은 일이 매우 간단 해 보이지만 A와 B 사이에는 항상 무언가가 있습니다.

다른 것보다 먼저 이것을 살펴보십시오 .

  1. P_ID (부모 테이블과 자식 테이블 모두의 부모 ID)가 있는지 확인하십시오.
  2. 물론 그것은 이미 부모에게 채워질 것입니다. 자녀에게 반드시 진실하고 최종적인 방법은 아닙니다. 예를 들어 P_ID # 3 (자식 테이블의 여러 번이 부모 테이블의 원래 P_ID를 가리킬 것입니다).
  3. SQL 탭으로 이동하고 (phpMyAdmin을 사용하고 있으며 다른 것과 비슷해야 함) 다음 명령을 수행하십시오.

    ALTER TABLE child_table_name    
    ADD FOREIGN KEY (P_ID)   
    REFERENCES parent_table_name (P_ID)
  4. 관계형 뷰에서 구조보다 하위 테이블을 클릭하십시오. 거기서 DB 계획을 완료하십시오. 캐스케이드, 제한 등에 대한이 답변 앞에 좋은 대답이있었습니다. 물론 명령으로 수행 할 수 있습니다 ...


9

외래 키는 테이블의 비 프라임 속성이 phpMyAdmin에서 다른 * 의 프라임 속성을 참조 함을 의미합니다. 먼저 외래 키를 인덱스로 설정하려는 열을 설정하십시오.

그런 다음 관계보기를 클릭하십시오

거기에 외래 키를 설정하는 옵션을 찾을 수 있습니다


7

InnoDB를 사용하면 ALTER TABLE을 사용하여 테이블에 새로운 외래 키 제약 조건을 추가 할 수 있습니다.

ALTER TABLE tbl_name
    ADD [CONSTRAINT [symbol]] FOREIGN KEY
    [index_name] (index_col_name, ...)
    REFERENCES tbl_name (index_col_name,...)
    [ON DELETE reference_option]
    [ON UPDATE reference_option]

반면 MyISAM이 컨텍스트에서 InnoDB에 비해 이점이 있다면 외래 키 제약 조건을 전혀 만들고 싶은 이유는 무엇입니까? 애플리케이션의 모델 레벨에서이를 처리 할 수 ​​있습니다. 외래 키로 사용하려는 열이 색인화되어 있는지 확인하십시오!


4
외래 키 제약으로 인해 많은 노력과 오류가 발생하지 않습니다. 예를 들어, 시스템에서 사용자를 삭제한다고 가정하겠습니다. 해당 사용자에 대한 데이터가 존재하는 데이터베이스의 모든 위치를 지정하는 코드를 작성하고 삭제하도록 지시 할 수 있습니다. 그러나 삭제 기능을 항상 최신 상태로 유지해야합니다. 반면에 모든 사용자 관련 데이터에 사용자 ID에 대한 FK가 있고 삭제시 계단식으로 설정되면 내 코드는 "이 사용자 삭제"라고 말하고 데이터베이스는 모든 것을 삭제합니다. 해당 사용자에 대한 FK 참조 유지 보수가 훨씬 깨끗합니다.
Nathan Long

1
@Nathan : 그것이 내가 게시물에서 말하는 것입니다. 모델 수준에서도 처리 할 수 ​​있습니다. 모델에서 삭제 캐스케이드를 구현할 수 있습니다.
markus

3
거의 항상 데이터베이스 테이블에 참조 무결성을 추가합니다. 데이터베이스는 나쁜 응용 프로그램 프로그래밍으로부터 스스로를 보호해야합니다. 데이터 무결성을 유지하기 위해 응용 프로그램에만 의존하지 마십시오. 물론 모든 규칙에는 항상 예외가 있지만 나는 이것에 대한 규칙을 찾지 못했습니다.
Harv

4

두 열의 데이터 형식이 같아야합니다.

예를 들어 한 열이 INT 유형이고 다른 열이 tinyint 유형 인 경우 다음 오류가 발생합니다.

[PID 열]에서 외래 키 생성 오류 (데이터 유형 확인)


3

1 단계 : mysql 구성 파일 (OS에 따라 my.cnf 또는 my.ini)의 [mysqld] 섹션에 default-storage-engine = InnoDB 행을 추가하고 mysqld 서비스를 다시 시작해야합니다. 여기에 이미지 설명을 입력하십시오

2 단계 : 이제 테이블을 만들 때 테이블 유형이 다음과 같이 표시됩니다. InnoDB

여기에 이미지 설명을 입력하십시오

3 단계 : 부모 테이블과 자식 테이블을 모두 만듭니다. 이제 Child 테이블을 열고 외래 키를 가지려는 U 열을 선택하십시오. 아래와 같이 Action Label에서 Index Key를 선택하십시오.

여기에 이미지 설명을 입력하십시오

4 단계 : 이제 아래와 같이 인쇄보기 근처에서 같은 자식 테이블에있는 관계보기를 엽니 다.

여기에 이미지 설명을 입력하십시오 5 단계 : 드롭 다운에서 부모 열을 선택하십시오.로 외래 키를 가지려는 U 열을 선택하십시오. dbName.TableName.ColumnName

ON DELETE 및 ON UPDATE에 적절한 값을 선택하십시오. 여기에 이미지 설명을 입력하십시오


2

스토리지 엔진을 먼저 InnoDB 로 설정

스토리지 엔진을 먼저 InnoDB로 설정

그런 다음 구조 메뉴에서 관계보기 옵션 활성화

그런 다음 관계보기 옵션 활성화


첫 번째 단계는 정확하지만 다음 단계는 모든 프로세스를 단계별로 작성하십시오.
kunal shaktawat

2

이것은 오래된 스레드이지만 누군가에게 유용하기 때문에 대답합니다.

1 단계 . Db 스토리지 엔진이 InnoDB로 설정

2 단계 . 기본 테이블 생성

여기는 customer기본 테이블이며 customer_id기본 키입니다

여기에 이미지 설명을 입력하십시오

3 단계 . 외래 키 테이블 생성 및 인덱스 제공

여기에 우리가있다 customer_addresses, 그래서 여기에 관련된 테이블 및 저장 고객 주소와 같은 customer_id과의 관계 customer테이블을

아래와 같이 테이블을 만들 때 직접 인덱스를 선택할 수 있습니다

여기에 이미지 설명을 입력하십시오

테이블을 만들 때 인덱스를 잊어 버린 경우 다음 과 같이 테이블 의 구조 탭 에서 인덱스를 제공 할 수 있습니다.

여기에 이미지 설명을 입력하십시오

4 단계 . 색인이 필드에 제공되면 구조 탭으로 이동하여 아래 그림과 같이 관계보기 를 클릭하십시오

여기에 이미지 설명을 입력하십시오

5 단계 . 이제 ON DELETE 및 ON UPDATE 할 작업을 선택하고 현재 테이블에서 열을 선택하고 DB (SAME DB)를 선택한 다음 아래 그림과 같이 해당 테이블에서 관계 테이블 및 기본 키를 선택하고 저장하십시오 .

여기에 이미지 설명을 입력하십시오

이제 관계가 성공적으로 부여되었는지 확인하고 외래 테이블 데이터 목록으로 이동하여 외래 키 값을 클릭하면 기본 테이블 레코드로 리디렉션 한 다음 관계가 성공적으로 이루어집니다.



0

phpMyAdmin의 최신 버전에는 더 이상 " Relation View "옵션이 없습니다.이 경우 동일한 것을 달성하기 위해 명령문을 실행해야합니다. 예를 들어

ALTER TABLE employees
    ADD CONSTRAINT fk_companyid FOREIGN KEY (companyid)
    REFERENCES companies (id)
    ON DELETE CASCADE;

이 예에서 회사의 행이 삭제되면 해당 회사 ID를 가진 모든 직원도 삭제됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.