문제

phpMyAdmin을 사용하여 데이터베이스를 설정하고 있습니다.나는 두 개의 테이블을 가지고 있습니다 (foo 그리고 bar), 기본 키에 인덱싱됨.관계형 테이블(foo_bar) 사이에 기본 키를 외래 키로 사용합니다.

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

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

내가 무엇을 놓치고 있나요?

설명/업데이트

단순화를 위해 phpMyAdmin을 계속 사용하고 싶습니다.저는 현재 PHP/CSS/Javascript에 집중할 수 있을 만큼 쉽고 phpMyAdmin과 함께 제공되는 XAMPP를 사용하고 있습니다.

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

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를 명시적으로 정의하지 않는 것이 불편할 뿐입니다.

도움이 되었습니까?

해결책

phpmyadmin을 사용하여 관계를 설정하려면 두 가지 작업을 수행해야합니다. 우선, 참조 테이블의 외래 키 열의 색인을 정의해야합니다 (SO_BAR.FOO_ID, 귀하의 경우). 그런 다음 관계보기 (참조 테이블에서)로 이동하여 참조 열 (따라서 FOO.ID) 및 ON 업데이트 및 삭제 작업을 선택하십시오.

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

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

다른 팁

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

자식이라는 테이블의 PID 열이 부모라는 테이블의 ID 열을 참조하도록 외국 키를 설정하려면 다음을 수행 할 수 있습니다.

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

Child Table에서 수출을하면 PID 열에 대한 외국 키 제약 조건이 생성되어야합니다.

이것은 Wikipedia 기사의 요약입니다. phpmyadmin에서 규정 할 수있는 다양한 유형의 관계를 지정합니다. "업데이트/삭제"에 대한 외래 키 옵션을 설정하는 것에 대한 @Nathan의 의견과 관련이 있지만 의견을 보내기에는 너무 크기 때문에 도움이되기를 바랍니다.

종속

마스터 (참조) 테이블의 행이 삭제 될 때마다 (resp. 업데이트), 일치하는 외국 키 열이있는 자식의 각 행 (참조) 테이블이 삭제됩니다 (Resp. 업데이트). 이것을 캐스케이드 삭제라고합니다 (Resp. Update [2]).

얽매다

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

조치 없음

어떤 조치와 제한도 거의 비슷하지 않습니다. 행동과 제한의 주요 차이점은 조치가 없으면 테이블을 변경하려고 시도한 후 참조 무결성 검사가 수행된다는 것입니다. 업데이트 또는 삭제 명령문을 실행하기 전에 수표를 제한합니다. 참조 무결성 검사가 실패한 경우 두 참조 조치 모두 동일하게 작동합니다. 업데이트 또는 삭제 명령문은 오류가 발생합니다.

NULL을 설정하십시오

참조 행이 업데이트되거나 삭제되면 참조 행의 외래 키 값이 NULL로 설정됩니다. 참조 테이블의 각 열을 무효화 할 수있는 경우에만 가능합니다. NULL의 의미론으로 인해 외래 키 열에 NULLS가있는 참조 행에는 참조 행이 필요하지 않습니다.

기본값으로 설정

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

phpmyadmin에서는 GUI에 의해 간단히 외국 키를 할당 할 수 있습니다. 테이블을 클릭하고 구조 탭으로 이동하십시오. 테이블의 벨로우즈에서 관계보기를 찾으십시오 (아래 이미지에 표시).

enter image description here

기본 키 근처의 목록 상자에서 단조 키를 할당 할 수 있습니다 (아래 이미지 참조). 그리고 저장

enter image description here

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

데이터베이스가 새로운 사람들의 경우 .... 기존 테이블을 변경해야합니다. 많은 것들이 꽤 간단한 것처럼 보이지만 항상 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 계획을 마치십시오. 캐스케이드, 제한 등에 관한 좋은 대답이있었습니다. 물론 명령에 의해 수행 될 수 있습니다 ...

외국 키는 테이블의 비 프라임 속성이 다른 사람의 주요 속성을 의미한다는 것을 의미합니다. *phpmyadmin에서* 먼저 외국 키를 색인으로 설정하려는 열을 설정합니다.

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

외국 키를 설정할 옵션을 찾을 수 있습니다.

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에 비해 장점이 있다면 외래 키 제약 조건을 생성하려는 이유는 무엇입니까?애플리케이션의 모델 수준에서 이를 처리할 수 있습니다.외래 키로 사용하려는 열이 색인화되어 있는지 확인하세요!

두 열에 동일한 데이터 유형이 있어야한다는 것을 잊지 마십시오.

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

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

1 단계 : MySQL 구성 파일의 [MySQLD] 섹션 (OS에 따라 My.cnf 또는 My.ini)의 [MySQLD] 섹션에있는 기본 스토리지 엔진 = innoDB를 추가해야합니다. MySQLD 서비스를 다시 시작해야합니다.enter image description here

2 단계 : 이제 테이블을 만들 때 테이블 유형이 표시됩니다 : Innodb

enter image description here

3 단계 : 부모와 자식 테이블을 만듭니다. 이제 자식 테이블을 열고 외부 키를 갖는 열 U 열을 선택하십시오. 아래와 같이 액션 레이블에서 인덱스 키를 선택하십시오.

enter image description here

4 단계 : 이제 아래 그림과 같이 인쇄보기 근처의 하단에서 동일한 하위 테이블의 관계보기를 엽니 다.

enter image description here5 단계 : 드롭 다운에서 부모 열을 선택할 때 외국 키를 선택하는 열 u를 선택하십시오. dbname.tablename.columnname

삭제 및 업데이트시 적절한 값을 선택하십시오enter image description here

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

MySQL은 외래 키 검사가 빠르고 테이블 스캔이 필요하지 않도록 외래 키와 참조 키에 대한 색인이 필요합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top