294

phpMyAdmin을 사용하여 데이터베이스를 설정하고 있습니다. 나는 두 개의 테이블을 가지고있다.foobar),기본 키에 색인되어있다.. 관계형 테이블을 만들려고합니다.foo_bar)를 사용하여 기본 키를 외래 키로 사용합니다.

나는이 테이블을 MyISAM으로 만들었지 만, 이후 MyISAM이 외래 키를 지원하지 않는다는 것을 읽었 기 때문에 InnoDB로 3 개를 모두 변경했습니다. 모든id필드는INT(11).

내가 선택할 때foo_bar테이블에서 "관계보기"링크를 클릭하고 FK 열을 설정하십시오database.foo.iddatabase.bar.id, 그것은 말한다"정의 된 색인 없음!"각 열 옆에.

내가 뭘 놓치고 있니?

설명 / 업데이트

간단히하기 위해 phpMyAdmin을 계속 사용하고 싶습니다. 현재 PHP / CSS / Javascript에 초점을 맞추기 쉽도록 XAMPP를 사용하고 있으며 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가 데이터베이스에 명시 적으로 정의되지 않도록하는 것이 불편합니다.

10 답변


324

phpMyAdmin을 사용하여 관계를 설정하려면 2 가지 작업을 수행해야합니다. 우선, 참조 테이블의 외래 키 컬럼에 대한 색인을 정의해야합니다 (foo_bar.foo_id, 그래서). 그런 다음 관계보기 (참조 표에서)로 이동하여 참조 된 열 (따라서 foo.id의 경우) 및 on update 및 delete 작업을 선택하십시오.

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

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


  • 팁 : 관계보기는 테이블 아래에 약간의 링크입니다. 처음에는 그것을 찾을 수 없었습니다. - Mladen Janjetovic
  • 해당 링크가 표시되지 않는 경우 : 해당 테이블이 InnoDB 유형 (phpMyAdmin의 작업 탭 아래에 있음)인지 확인하십시오. - muttley91
  • @ muttley91My 테이블 InnoDB입니다. 나는 이중 확인했다. 링크가 여전히 표시되지 않습니다. - afilina
  • 거기에 있습니다.imgur.com/gw80CWC - shershen
  • @afilina phpMyAdmin의 새 버전에서는 & quot; 구조 & quot; 내부의 맨 위에 표시됩니다. 탭, & quot; 탐색 & quot; & quot; 구조 & quot; 등이 표시된 탭 행 바로 아래에 있습니다. - Astitva Srivastava

210

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 열에 대해 외래 키 제약 조건이 생성 된 것을 볼 수 있습니다.


  • 와우, 알아야 할 아주 중요한 것. 이 페이지는 외래 키를 추가하는 데 도움이 될 때 처음 발견 한 것이 아니 었습니다. 더 자주 언급되기를 바랍니다. - user1299656

75

이것은 위키피디아 (Wikipedia) 기사의 요약입니다. PHPmyadmin에서 지정할 수있는 다양한 유형의 관계를 지정합니다. 나는 "on update / delete"에 대한 외래 키 옵션을 설정하는 @ Nathan의 코멘트와 관련이 있기 때문에 여기에 올리 겠지만 코멘트에는 너무 큽니다. 도움이되기를 바랍니다.

종속

마스터 (참조) 테이블의 행이 삭제 (갱신) 될 때마다 일치하는 외부 키 컬럼이있는 하위 (참조) 테이블의 각 행이 삭제 (갱신)됩니다. 이를 계단식 삭제 (update [2])라고합니다.

얽매다

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

조치 없음

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

SET NULL

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

기본값으로 설정

SET NULL과 마 y 가지로, 참조 행이 갱신되거나 h 제될 때 참조 행의 외부 키 값은 디폴트 열로 설정됩니다.



50

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

enter image description here

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

enter image description here

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


12

데이터베이스를 처음 사용하는 사람들은 .... 기존 테이블을 변경해야합니다. 많은 것들은 꽤 직설적 인 것처럼 보이지만 A와 B 사이에는 항상 뭔가가 있습니다.

다른 무엇보다 먼저 살펴보십시오..

  1. P_ID (상위 테이블과 하위 테이블 모두에 상위 ID)가 있는지 확인하십시오.
  2. 물론 그것은 이미 부모에게 채워질 것입니다. 반드시 진실하고 최종적인 방법으로 아이에게 꼭 필요한 것은 아닙니다. 그래서 예를 들어 P_ID # 3 (아마도 자식 테이블에서 여러 번 부모 테이블의 원래 P_ID를 가리킬 것입니다).
  3. SQL 탭으로 가라. phpMyAdmin을 사용하고 있는데 다른 것들과 비슷해야한다.

    ALTER TABLE child_table_name

    외부 키 추가 (P_ID)

    참조 parent_table_name (P_ID)

  4. 관계형 뷰에서 구조체보다 하위 테이블을 클릭하십시오. DB 계획을 마치십시오. 캐스케이드, 제한 등에 관한 멋진 답변이있었습니다. 물론 명령으로 할 수 있습니다 ...


9

외래 키 란 테이블의 비 (non) 프라임 속성이 다른 테이블의 프라임 속성을 참조 함을 의미합니다.*phpMyAdmin에서* 먼저 외래 키를 설정할 인덱스를 인덱스로 설정합니다.

RELATION VIEW를 클릭하십시오.

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


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에 비해 장점이 있다면 왜 외래 키 제약 조건을 생성하고 싶습니까? 이를 응용 프로그램의 모델 수준에서 처리 할 수 있습니다. 외래 키로 사용할 열이 인덱싱되었는지 확인하십시오!


  • 외래 키 제약 조건 때문에 많은 노력과 잠재적 인 오류가 발생하지 않습니다. 예를 들어, 내 시스템에서 사용자를 삭제하겠습니다. 해당 사용자에 대한 데이터가있는 데이터베이스의 모든 위치를 지정하는 코드를 작성하여 삭제하도록 지시 할 수 있습니다. 그러나 나는 항상 삭제 기능을 최신 상태로 유지해야한다. 반면에 모든 사용자 관련 데이터의 사용자 ID가 FK이고 삭제가 계단식으로 설정된 경우 내 코드는 & quot;이 사용자 삭제 & quot;라고 말합니다. 데이터베이스는 해당 사용자에 대한 FK 참조가있는 모든 항목을 삭제합니다. 유지 보수가 훨씬 낫다. - Nathan Long
  • @ 네이슨 : 나는 그 글에서 내가 말한 것과 관련이있다. 모델 레벨에서도이를 처리 할 수 있습니다. 모델에서 삭제 캐스케이드를 구현할 수 있습니다. - markus
  • 거의 항상 데이터베이스 테이블에 참조 무결성을 추가합니다. 데이터베이스는 잘못된 응용 프로그램 프로그래밍으로부터 스스로를 보호해야합니다. 데이터 무결성을 유지하기 위해 애플리케이션 단독으로 의존하지 마십시오. 물론 모든 규칙에는 항상 예외가 있지만이 규칙을 찾지 못했습니다. - Harv

4

두 열이 동일한 데이터 형식을 가져야 함을 잊지 마십시오.

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

[PID 열]에 외래 키를 만드는 중 오류가 발생했습니다 (데이터 유형 확인).


2

1 단계: 다음 행을 추가해야합니다. default-storage-engine = InnoDB mysqld 설정 파일의 [mysqld] 섹션 (OS에 따라 my.cnf 또는 my.ini)에서 mysqld 서비스를 다시 시작한다.enter image description here

2 단계: 이제 테이블을 생성 할 때 테이블의 타입을 볼 수있다 : InnoDB

enter image description here

3 단계 : 부모 및 자식 테이블을 모두 만듭니다. 이제 하위 테이블을 열고 외래 키를 갖고 싶은 열 U를 선택하십시오. 아래와 같이 Action Label에서 Index Key를 선택하십시오.

enter image description here

4 단계 : 아래 그림과 같이 Print 뷰 옆의 아래쪽에서 같은 자식 테이블의 관계 뷰를 엽니 다.

enter image description here5 단계 : 외래 키를 드롭 다운 목록에서 선택하려면 열 U를 선택하십시오. dbName.TableName.ColumnName

ON DELETE 및 ON UPDATE에 적절한 값 선택enter image description here


0

공식 MySQL 설명서에서https://dev.mysql.com/doc/refman/8.0/en/create-table-foreign-keys.html:

MySQL은 외래 키와 참조 키에 대한 인덱스가 필요하므로   외래 키 검사는 빠르며 테이블 스캔이 필요하지 않습니다.

연결된 질문


관련된 질문

최근 질문