복붙노트

[SQL] SQL Server 2008의 복합 외래 키 만들기

SQL

SQL Server 2008의 복합 외래 키 만들기

나는에 대한 외부 키를 생성하고 싶습니다 두 개의 테이블이있다.

기본 테이블

PK - Key1 - varchar(20)
PK - Key2 - date

보조 테이블

PK - AutoID
FK - Key1 - varchar(20)
FK - Key2 - date

나는 기본 및 보조 테이블 간의 관계를 만들려고 할 때, 나는 메시지가 계속

우리는 자동으로 번호를 생성 기본 키를 만들 수 있도록 같은 키 1과 키 2와 보조 테이블에 많은 레코드가있을 수 있습니다.

나는이 두 테이블 사이의 외래 키 관계를 설정하는 방법에 대한 어떤 생각?

해결법

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

    1.이 중 일부는이 중 일부는이 같은 문제의 모든 종류 가진 다른 사람에 대한 상황이며, 집중 (첫번째 사람이 실제로 검색 등을?)

    이 중 일부는이 중 일부는이 같은 문제의 모든 종류 가진 다른 사람에 대한 상황이며, 집중 (첫번째 사람이 실제로 검색 등을?)

    당신은 당신이 두 테이블의 데이터 유형 불일치하지 않았다 있도록하는 키를 생성에 문제가있을 때 가장 먼저 확인합니다. 하나의 BIGINT 다른의 int이있는 경우, 그것을 날려 버리겠다. 이것은 모든 키에 대한 사실,하지만 당신은 여러 필드를 사용하는 경우 돌발 가능성이 높습니다. 간단한 수학은 이유있는 기회 증가를 보여줍니다.

    다음 문제는 데이터입니다. 이 때문에 데이터에 키를 만들 수없는 경우에는 부모 테이블에 존재하지 않는 자식 테이블에 존재 무엇인지 찾을 수있다. 왼쪽 테이블 (의 제 / 좌측 보조 조인)에 가입하고 기본 테이블이 null이고 행만을 포함한다. 당신도 부모 테이블에서 이러한 레코드를 만들거나 그들을 제거해야합니다.

    한 가지 방법은 "약"이 부모 테이블에 새 기본 키를 설정합니다. 그런 다음이 새 기본 키 외래 키를 생성하고 자식 테이블에 가능한 한 많은 레코드로 일치합니다. 그런 다음이 설정 조인 가지고 있고 보조 작업으로 청소에 대해 갈 수 있습니다.

    어떤게 더 좋아? 복합 키를 가진 새로운 기본 키 또는 작업? 이건 정말 데이터의 특성에 따라 달라집니다,하지만 난 자연 키 또는 복합 키를 통해 파생 된 키를 사용하여 더 좋아한다. 그러나, 하나의 필드를 얻을하는 데 필요한 작업은 키가 많은 작업입니다 파생 때가있다.

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

    2.외부 키 컬럼, 자신의 종류와 순서의 같은 수의 고유 인덱스 (PK 또는 영국)를 구성하는 열을 참조해야합니다. 예컨대 :

    외부 키 컬럼, 자신의 종류와 순서의 같은 수의 고유 인덱스 (PK 또는 영국)를 구성하는 열을 참조해야합니다. 예컨대 :

    CREATE TABLE PrimaryTable (
      Key1 varchar(20),
      Key2 date)
    GO
    
    ALTER TABLE PrimaryTable ADD CONSTRAINT PK
      PRIMARY KEY (Key1, Key2)
    GO
    
    CREATE TABLE SecondaryTable (
      AutoID int IDENTITY,
      Key1 varchar(20),
      Key2 date)
    GO
    
    ALTER TABLE SecondaryTable ADD CONSTRAINT FK
      FOREIGN KEY (Key1, Key2) REFERENCES PrimaryTable (Key1, Key2)
    GO
    
  3. ==============================

    3.이것은 작동합니다 :

    이것은 작동합니다 :

    CREATE TABLE PTable (
         Key1 varchar(20) not null,
         Key2 date not null,
         constraint PK_PTable PRIMARY KEY (Key1,Key2)
    )
    
    CREATE TABLE STable (
         AutoID int IDENTITY(1,1) not null primary key,
         Key1 varchar(20) not null,
         Key2 date not null,
         constraint FK_STable_PTable FOREIGN KEY (Key1,Key2) references PTable (Key1,Key2)
    )
    

    당신이해야 할 것은 스크립트로 테이블을 관리 Studio를 얻고 그 위의 비교입니다.

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

    4.이 좋은 답은 여기에 있습니다,하지만 난 더이 단계 싶습니다 - 후손을 위해서입니다.

    이 좋은 답은 여기에 있습니다,하지만 난 더이 단계 싶습니다 - 후손을 위해서입니다.

    외부 키 참조 중 하나를 기본 키 (고유, 클러스터 된 인덱스)에 있는가 또는 고유 다른 테이블에 열을 제약. 기본적으로 필요한 구성 요소는 고유 제약 조건입니다. 나는 당신이 당신의 외래 키에 널 (NULL) 컬럼을 가질 수 있음을 추가 할 수 있지만 허용 할 경우 "복합"키 SQL에 널 (null)은 외래 키 관계에있는 데이터의 검증을 건너 뜁니다. 이것은 우리의 대부분은 우리의 데이터베이스에서 데이터 무결성을 보장하기 위해 외래 키입니다 사용하는 주된 이유로서 기억해야 할 중요한 포인트입니다.

    최종 메모에서 명시 적으로 같은 내 모든 키 이름을 선언합니다. 왜, 당신은 요청할 수 있습니다? 당신은 더 나은 검색 기능에 대한 미래의 "전체 텍스트 인덱싱"를 사용해야하는 경우는 키의 모든 "자동 생성"이름을 참조하는 힘, 그래서 일을하지. 이 데이터 변환 또는 예약 된 전체 텍스트 색인 업데이트를 필요로하지 않는 작은 프로젝트에 대한 큰 문제가되지 않을 수도 있습니다,하지만 당신은이 기능을 스크립팅하는 경우 (예를 들어 당신의 차의 실제 이름을 찾아 볼 필요가 당신의 일을 더 어렵게 만들 수 키의 기본 이름 : pk_someTable_1248594832828495904).

    여기에 내가 어떤 미래의 함정을 피하기 위해 SQL을 서면으로 할 것 인 것이다 :

    코드:

    CREATE TABLE MySchema.PrimaryTable ( 
      Key1 varchar(20) NOT NULL, 
      Key2 date NOT NULL,
      CONSTRAINT PK_MySchema_PrimaryTable_Key1_Key2 PRIMARY KEY (Key1, Key2)
    )
    GO 
    
    CREATE TABLE MySchema.SecondaryTable ( 
      AutoID int IDENTITY, 
      Key1 varchar(20) NOT NULL, 
      Key2 date NOT NULL,
      CONSTRAINT FK_MySchema_SecondaryTable_Key1_Key2
         FOREIGN KEY (Key1, Key2) REFERENCES PrimaryTable (Key1, Key2)
    )
    GO 
    

    OptillectTeam는 그의 대답에에 기본적으로 죽었어요. 난 그냥 전에 언급되지 않은 몇 가지 중요한 일을 명확히하고 싶었다. 외래 키 제약 조건 : 외래 키에 이것과 더 많은 논의 MSDN 시력에 좋은 참조가 있습니다.

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

    5.QUERY BELOW UNIQUE KEY 사용을 추가

    QUERY BELOW UNIQUE KEY 사용을 추가

       ALTER TABLE [TableName] ADD UNIQUE ([Column1], [Column2]);
    
  6. from https://stackoverflow.com/questions/6651667/creating-a-composite-foreign-key-in-sql-server-2008 by cc-by-sa and MIT license