문제

내가 찾는 것에서 MySQL 문서 과 밖으로 정렬하려의 차이는 외국 열쇠 및 제약 조건이 있습니다.내가 생각하는 FK 제약 조건이지만,문서 보이 그들에 대해 이야기처럼 그들은 별개의 것이다.

를 만들기 위한 구문을 FK(부분)...

[CONSTRAINT [symbol]] FOREIGN KEY
    [index_name] (index_col_name, ...)
    REFERENCES tbl_name (index_col_name,...)

그래서"제"조항은 선택사항입니다.왜 당신은 그것을 포함하거나 포함되지 않은?는 경우에 당신은 그것을 빼지 않 MySQL 외래 키를 만들지만 제약 조건?이 더 좋아하고"제가"아무것보다 더 이름이 당신을 위해 FK,그래서 지정하지 않는 경우 그것은 당신을 얻을 익명 FK?

모든 설명을 주시면 감사하겠습니다.

감사합니다,

이단

도움이 되었습니까?

해결책

그렇습니다. 외국 키는 한 가지 제약 조건입니다. MySQL은 제약 조건에 대한 고르지 않은 지원을받습니다.

  • PRIMARY KEY: 예 테이블 제약 조건 및 열 제약 조건입니다.
  • FOREIGN KEY: 예, 테이블 제약 조건으로, InnoDB 및 BDB 스토리지 엔진만으로; 그렇지 않으면 구문 분석되었지만 무시됩니다.
  • CHECK: 모든 스토리지 엔진에서는 구문 분석되었지만 무시됩니다.
  • UNIQUE: 예 테이블 제약 조건 및 열 제약 조건입니다.
  • NOT NULL: 예, 열 제약 조건입니다.
  • DEFERRABLE 및 기타 제약 속성 : 지원 없음.

그만큼 CONSTRAINT 절을 사용하면 제약 조건을 명시 적으로 명시 적으로 이름을 지정하여 메타 데이터를보다 읽기 쉽게 만들거나 제약 조건을 삭제하려고 할 때 이름을 사용하도록 할 수 있습니다. SQL 표준은이를 요구합니다 CONSTRAINT 절은 선택 사항입니다. 당신이 그것을 떠나면, rdbms는 이름을 자동으로 생성하고 이름은 구현에 달려 있습니다.

다른 팁

일반적으로 (필수 MySQL이 아님), 외국 키는 제약이지만 제약 조건이 항상 외래 키는 아닙니다. 주요 주요 제약 조건, 고유 한 제약 등을 생각하십시오.

특정 질문으로 돌아 오면 제약 조건을 생략하면 자동으로 생성 된 이름의 FK가 생성됩니다.

지금,우리의 테이블 생성 Ddl 는 이 형식으로 통지한 키고 외국인 핵심 정의 구문은 우리가 사용됩니다.

CREATE TABLE my_dbschema.my_table (
    id INT unsigned auto_increment PRIMARY KEY,
    account_nbr INT NOT NULL,
    account_name VARCHAR(50) NOT NULL,
    active_flg CHAR(1) NOT NULL DEFAULT 'Y',
    vendor_nbr INT NOT NULL,
    create_ts TIMESTAMP NOT NULL DEFAULT current_timestamp,
    create_usr_id VARCHAR(10) NOT NULL DEFAULT 'DFLTUSR',
    last_upd_ts TIMESTAMP NOT NULL DEFAULT current_timestamp ON UPDATE current_timestamp,
    last_upd_usr_id VARCHAR(10) NOT NULL DEFAULT 'DFLTUSR',
    UNIQUE KEY uk1_my_table(account_nbr, account_name),
    FOREIGN KEY fk1_my_table(vendor_nbr) REFERENCES vendor(vendor_nbr)
    );

이 포맷에서,MySQL 을 만드 인덱스-es 이름으로 uk1_my_table 및 fk1_my_table 자동으로;하지만 FK 객체 이름을 다른 무언가가-my_table_ibfk_1(ie.tablename_ibfk_N–시스템 정의).그래서 ALTER TABLE my_table DROP FOREIGN KEY fk1_my_table 지(따라서 좌절하고 올리는 알람),로 없 FK db 개체는 이름입니다.

여기에는 대체 DDL wrt 형식의 constarints(Ref: https://dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html) :-

CREATE TABLE my_dbschema.my_table (
    id INT unsigned auto_increment PRIMARY KEY,
    account_nbr INT NOT NULL,
    account_name VARCHAR(50) NOT NULL,
    active_flg CHAR(1) NOT NULL DEFAULT 'Y',
    vendor_nbr INT NOT NULL,
    create_ts TIMESTAMP NOT NULL DEFAULT current_timestamp,
    create_usr_id VARCHAR(10) NOT NULL DEFAULT 'DFLTUSR',
    last_upd_ts TIMESTAMP NOT NULL DEFAULT current_timestamp ON UPDATE current_timestamp,
    last_upd_usr_id VARCHAR(10) NOT NULL DEFAULT 'DFLTUSR',
    CONSTRAINT uk1_my_table UNIQUE KEY (account_nbr, account_name),
    CONSTRAINT fk1_my_table FOREIGN KEY (vendor_nbr) REFERENCES vendor(vendor_nbr)
    );

이 포맷에서,MySQL 은 여전히 만드 인덱스-es 이름으로 uk1_my_table 및 fk1_my_table 자동으로하지만,FK 객체 이름되지 않은 다른 무언가–그것은 fk1_my_table 로에서 언급된 DDL.그래서 ALTER TABLE my_table DROP FOREIGN KEY fk1_my_table 작동,하지만 뒤에 나뭇잎 이름을 딴 인덱스입니다.

고,참고 ALTER TABLE my_table DROP INDEX fk1_my_table 일하지 않을 것이 처음에는 때(FK 되지 않은 아직 떨어),오류 메시지와 함께 사용되는 것에 FK!을 경우 드롭 FK 명령이 정상적으로 실행되었다,다음에 드롭 인덱스 작동합니다.

이 설명하고 해결하는 데 도움이 됩니다.

MySQL에 대해서는 대답 할 수 없지만 FK는 제약입니다. 데이터를 특정 조건으로 강요하는 것은 제약입니다. 여러 종류의 제약 조건이 있으며, 고유 한 기본 키, 체크 및 외국 키는 모두 제약입니다. 아마도 MySQL에는 다른 사람이있을 것입니다.

때로는 단어가 명령으로 허용되지만 삭제 명령문에서 나온 것과 같은 가독성을 위해 엄청나게 필요하지는 않습니다.

내가 틀리지 않으면 제약 조건에 인덱스가 필요하므로 예를 들어 외국 키 제약 조건 MySQL이 자동으로 인덱스를 생성합니다.

이것은 아마도 대부분의 혼란 topìc 에서 MySQL.

많은 사람들이 말하는,예를 들어,기본 키가','외국인 핵심',그리고'고유의'키를 실제로 인덱스!(MySQL 공식 문서가 포함되어 있습니다 여기)

많은 사람들,다른 한편으로는,말 그들은 오히려 제약(는 의미의 원인,당신이 그들을 사용할 때,당신은 정말 당당한 제한에 영향을 받는 열).

면 그들은 정말 인덱스는,다음에서 중요한 점은 무엇인을 사용하여 제약 조건 clausule 하기 위해서 그것의 이름을,이후 당신이 사용할 수 있는 이름의 색인을 생성할 때는?

예제:

...외국인 해당 키(col_name1,col_name2,...)

는 경우 외국인 핵심 지표,그 후에 우리를 사용할 수 있어야 합니다면 해당 이를 처리하도록 합니다.그러나 우리가 할 수 없습니다.

하지만 그들이 없다면 인덱스이지만 실제적인 제약 조건을 할 사용하여 인덱스를 작동한 다음,이해가지 않습니다.

어떤 경우에,우리는 알지 못한다.실제로,아무도 알고 있는 것 같다.

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