복붙노트

[SQL] 외래 키 참조가 아닌 고유 인덱스 할 수 있습니까?

SQL

외래 키 참조가 아닌 고유 인덱스 할 수 있습니까?

나는 하나의 행이 단일 행 참조해야 함을 의미하는 외부 키를 생각했지만, 나는이 확실히 경우가 아니라 일부 테이블에서 찾고 있어요. 표는 표 2에서 2 열에서 외래 키 제약 조건, 컬럼을 가지고 있지만 2 열에서 같은 값을 표 2에 많은 기록이있다. 2 열에서 고유하지 않은 인덱스도 있습니다. 이것은 무엇을 의미 하는가? 외래 키 제약 조건은 단순히 적어도 하나 개의 기록은 오른쪽 컬럼의 오른쪽 값으로 존재해야한다는 것을 의미합니까? 나는 그것이 정확히 하나의 기록이 있어야합니다 의미 생각 (하지 않도록 널 (null)이 그림에 맞는 방법,하지만 덜 순간에 그것에 대해 걱정).

갱신 : 분명히,이 문제는 내가 사용하는 무엇이다 MySQL은, 특정입니다,하지만 난 내 원래의 질문에 언급하지 않았다.

해결법

  1. ==============================

    1.MySQL의 문서에서 :

    MySQL의 문서에서 :

    그러나, 참조 된 테이블의 고유하지 않은 컬럼에 외래 키를 피하기 위해 실제적인 이유가있다. 즉, 어떤 경우에 "DELETE CASCADE ON"의 의미되어야 하는가?

    문서는 더 조언 :

  2. ==============================

    2.귀하의 분석은 정확; 키는 고유하지 않으며, 제약 일치하는 행 세트에 역할을합니다. 당신이 원하는 어디하지 일반적으로 유용한 동작은하지만, 상황이 올 수 있습니다.

    귀하의 분석은 정확; 키는 고유하지 않으며, 제약 일치하는 행 세트에 역할을합니다. 당신이 원하는 어디하지 일반적으로 유용한 동작은하지만, 상황이 올 수 있습니다.

  3. ==============================

    3.예, 당신은 어떤 테이블에 기본적으로 모든 열 (들)에 외래 키를 생성 할 수 있습니다. 대부분의 시간을 당신은하지만, 기본 키에를 만듭니다.

    예, 당신은 어떤 테이블에 기본적으로 모든 열 (들)에 외래 키를 생성 할 수 있습니다. 대부분의 시간을 당신은하지만, 기본 키에를 만듭니다.

    기본 키에 지점을하지 않는 외래 키를 사용한다면, 당신은 또한 성능을 위해서 참조되는 컬럼 (들)에 (고유하지 않은) 인덱스를 생성 할 수 있습니다.

    사용중인 RDBMS에 따라 다릅니다. 나는 어떤 암시 당신을 위해 이렇게 생각, 또는 다른 트릭을 사용합니다. RTM.

  4. ==============================

    4.이 경우, 보통 두 개의 외래 키가 서로 연결되고 있다는 것을 의미한다. 종종 기본 키와 키를 포함 할 테이블 심지어 스키마에 있지 않습니다.

    이 경우, 보통 두 개의 외래 키가 서로 연결되고 있다는 것을 의미한다. 종종 기본 키와 키를 포함 할 테이블 심지어 스키마에 있지 않습니다.

    예 : 두 테이블, 대학과 학생 모두가 우편 번호라는 컬럼을 포함하고있다.

    우리는 빠른 검사에 대한 작업을 수행하는 경우

    SELECT * FROM COLLEGES JOIN STUDENTS ON COLLEGES.ZIPCODE = STUDENTS.ZIPCODE
    

    우리는 관계가 많은 많은 것을 발견 할 수 있습니다. 우리의 스키마가 기본 키의 우편 번호로 된 우편 번호라는 테이블을 가지고 있다면, 정말 무슨 일이 일어나고 있는지 분명 할 것이다.

    그러나 우리의 스키마는 이러한 테이블이 없습니다. 우리의 스키마가있다해서 그런 테이블은 그러나, 존재하지 않는 이러한 데이터를 의미하지 않습니다. 어딘가에는 USPO 토지에서, 바로 그러한 테이블이 있습니다. 그리고 COLLEGES.ZIPCODE 및 STUDENTS.ZIPCODE 모두 해당 테이블에 대한 참조는 우리가 그것을 인정하지 않는 경우에도입니다.

    이 데이터베이스를 구축하는 연습보다는 데이터의 철학과 더 가지고 있지만 깔끔하게 근본적인 무언가를 보여 데이터는 우리가 발명 것을 우리가 발견한다는 특성을 가지고 있으며,뿐만 아니라 특성. 물론, 우리가 발견 한 것을 다른 발명 어떤 사람이 될 수 있습니다. 그것은 확실히 우편 번호의 경우이다.

  5. ==============================

    5.PostgreSQL의는이를 거부 (가능하더라도, 어쨌든 그것은 좋은 아이디어를 의미하지 않는다)

    PostgreSQL의는이를 거부 (가능하더라도, 어쨌든 그것은 좋은 아이디어를 의미하지 않는다)

    essais=> CREATE TABLE Cities (name TEXT, country TEXT);
    CREATE TABLE
    essais=> INSERT INTO Cities VALUES ('Syracuse', 'USA');
    INSERT 0 1
    essais=> INSERT INTO Cities VALUES ('Syracuse', 'Greece');
    INSERT 0 1
    essais=> INSERT INTO Cities VALUES ('Paris', 'France');
    INSERT 0 1
    essais=> INSERT INTO Cities VALUES ('Aramits', 'France');
    INSERT 0 1
    essais=> INSERT INTO Cities VALUES ('Paris', 'USA');
    INSERT 0 1
    
    essais=> CREATE TABLE People (name TEXT, city TEXT REFERENCES Cities(name));
    ERROR:  there is no unique constraint matching given keys for referenced table "cities"
    
  6. ==============================

    6.Necromancing. 다른 사람들이 이미 말했듯이, 당신은 외부 키로 고유하지 않은 키를 참조하지 않아야합니다. 하지만 당신은 (삭제 캐스케이드 위험없이) 대신 할 수있는 (적어도 MS-SQL에서) 체크 - 제약 조건을 추가하고있다. 즉 정확히 외래 키와 같은 아니지만, 적어도 그것은 잘못된 / 고아 / 죽은 데이터의 삽입을 방지 할 수 있습니다.

    Necromancing. 다른 사람들이 이미 말했듯이, 당신은 외부 키로 고유하지 않은 키를 참조하지 않아야합니다. 하지만 당신은 (삭제 캐스케이드 위험없이) 대신 할 수있는 (적어도 MS-SQL에서) 체크 - 제약 조건을 추가하고있다. 즉 정확히 외래 키와 같은 아니지만, 적어도 그것은 잘못된 / 고아 / 죽은 데이터의 삽입을 방지 할 수 있습니다.

    (당신이 포트에 MySQL의 구문에 MS-SQL 코드를해야합니다) 참조 여기를 참조하십시오 : 비 기본 키 외래 키

    편집하다: MySQL의의 CHECK 제약 조건에 따라 downvote에 대한 이유을 검색, MySQL은 정말 CHECK 제약 조건을 지원하지 않습니다. 당신은 호환성을 위해 귀하의 DDL 쿼리를 정의 할 수 있습니다,하지만 그들은 단지 무시됩니다 ...

    이 언급 한 바와 같이, 당신은 더 큰 엉망 것을 제외하고는 기본적으로 같은 일이 데이터의 요구 사항이 충족되지 않는 오류를 던질 것이다, 삽입하기 전에 및 UPDATE 트리거하기 전에를 만들 수 있습니다.

    질문에 관해서는 :

    어떤 제정신의 RDBMS, 이것은 사실이다. 이 MySQL은 가능하다는 사실은 또 하나의 이유입니다 MySQL은 인 - 제정신 RDBMS입니다. 그것은 빠르고,하지만 속도의 제단에 참조 무결성 및 데이터 품질을 희생하는 것은 품질 RDBMS의 내 생각이 아니다 있습니다. 이 ACID 호환이 아니라면 사실, 그것은 (제대로 작동이) 전혀 RDBMS 정말 아니다.

  7. ==============================

    7.어떤 데이터베이스 우리는 소리 야? SQL 2005 년, 나는 외래 키 제약 조건을 만들 수 없습니다 참조하는 (다른 기본 키 또는) 고유 제한 조건이없는 열입니다.

    어떤 데이터베이스 우리는 소리 야? SQL 2005 년, 나는 외래 키 제약 조건을 만들 수 없습니다 참조하는 (다른 기본 키 또는) 고유 제한 조건이없는 열입니다.

    create table t1
    (
      id int identity,
      fk int
    );
    
    create table t2
    (
      id int identity,
    );
    
    CREATE NONCLUSTERED INDEX [IX_t2] ON [t2] 
    (
        [id] ASC
    );
    ALTER TABLE t1 with NOCHECK
    ADD CONSTRAINT FK_t2 FOREIGN KEY (fk)
        REFERENCES t2 (id) ;
    
    
    Msg 1776, Level 16, State 0, Line 1
    There are no primary or candidate keys in the referenced table 't2' 
    that match the referencing column list in the foreign key 'FK_t2'.
    Msg 1750, Level 16, State 0, Line 1
    Could not create constraint. See previous errors.
    

    실제로이 작업을 수행 할 수 있다면, 당신은 효과적으로 중간 테이블없이 불가능하다 대다 관계를 가질 것이다. 나는 정말이에 대한 자세한 내용을 듣고에 관심이있을 것입니다 ...

    이 관련 질문도를 참조하십시오.

  8. from https://stackoverflow.com/questions/588741/can-a-foreign-key-reference-a-non-unique-index by cc-by-sa and MIT license