복붙노트

[SQL] 어떻게 SQL Server에서 외래 키를 만들려면 어떻게해야합니까?

SQL

어떻게 SQL Server에서 외래 키를 만들려면 어떻게해야합니까?

나는 SQL Server 및 외래 키 선언 객체 생성 코드는 겉으로는 SQL Server와 포스트 그레스의 차이입니다 "손 코딩하지"적이 없다. 여기 내 SQL은 지금까지입니다 :

drop table exams;
drop table question_bank;
drop table anwser_bank;

create table exams
(
    exam_id uniqueidentifier primary key,
    exam_name varchar(50),
);
create table question_bank
(
    question_id uniqueidentifier primary key,
    question_exam_id uniqueidentifier not null,
    question_text varchar(1024) not null,
    question_point_value decimal,
    constraint question_exam_id foreign key references exams(exam_id)
);
create table anwser_bank
(
    anwser_id           uniqueidentifier primary key,
    anwser_question_id  uniqueidentifier,
    anwser_text         varchar(1024),
    anwser_is_correct   bit
);

내가 쿼리를 실행하면이 오류를 얻을 :

당신은 오류를 발견 할 수 있습니까?

해결법

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

    1.

    create table question_bank
    (
        question_id uniqueidentifier primary key,
        question_exam_id uniqueidentifier not null,
        question_text varchar(1024) not null,
        question_point_value decimal,
        constraint fk_questionbank_exams foreign key (question_exam_id) references exams (exam_id)
    );
    
  2. ==============================

    2.당신은 그냥 그 자체에 제약 조건을 만들려면, 당신은 ALTER TABLE을 사용할 수 있습니다

    당신은 그냥 그 자체에 제약 조건을 만들려면, 당신은 ALTER TABLE을 사용할 수 있습니다

    alter table MyTable
    add constraint MyTable_MyColumn_FK FOREIGN KEY ( MyColumn ) references MyOtherTable(PKColumn)
    

    차라리 내 자신의 제약 조건의 이름을 하듯 때문에, 인라인 생성에 사라 Chipps 언급 구문을 권하고 싶지 않다.

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

    3.또한 사용하여 외래 키 제약 조건의 이름을 지정할 수 있습니다 :

    또한 사용하여 외래 키 제약 조건의 이름을 지정할 수 있습니다 :

    CONSTRAINT your_name_here FOREIGN KEY (question_exam_id) REFERENCES EXAMS (exam_id)
    
  4. ==============================

    4.AlexCuse의 대답과 같은 I,하지만 당신은 당신이 외래 키 제약 조건을 추가 할 때마다주의를 지불해야 뭔가 당신이 처리 될 참조 된 테이블의 행에 참조 된 열을 업데이트 할 방법, 당신은 참조의 행의 삭제를 원하는 특히 어떻게 테이블을 처리합니다.

    AlexCuse의 대답과 같은 I,하지만 당신은 당신이 외래 키 제약 조건을 추가 할 때마다주의를 지불해야 뭔가 당신이 처리 될 참조 된 테이블의 행에 참조 된 열을 업데이트 할 방법, 당신은 참조의 행의 삭제를 원하는 특히 어떻게 테이블을 처리합니다.

    제약 조건은 다음과 같이 작성되는 경우 :

    alter table MyTable
    add constraint MyTable_MyColumn_FK FOREIGN KEY ( MyColumn ) 
    references MyOtherTable(PKColumn)
    

    .. 참조하는 테이블의 해당 행이있을 경우 다음 참조 된 테이블에서 업데이트 또는 삭제가 오류와 함께 날려 버리겠다.

    그것은 당신이 원하는 행동이 될 수도 있지만 내 경험, 그것은 훨씬 더 일반적으로하지 않습니다.

    대신이처럼 만드는 경우 :

    alter table MyTable
    add constraint MyTable_MyColumn_FK FOREIGN KEY ( MyColumn ) 
    references MyOtherTable(PKColumn)
    on update cascade 
    on delete cascade
    

    부모 테이블 ..then 업데이트 및 삭제는 참조 테이블에서 해당 행의 업데이트와 삭제가 발생합니다.

    (I 기본이 좋은주의의 측면에 기본 잘못한다을 변경해야한다고 제안하고 있지 않다. 난 그냥 그것의 무언가를 말하고 그 constaints을해야 항상주의를 기울를 작성하는 사람입니다.)

    이 방법에 의해 수행 할 수 있습니다,이 같은 테이블을 만들 때 :

    create table ProductCategories (
      Id           int identity primary key,
      ProductId    int references Products(Id)
                   on update cascade on delete cascade
      CategoryId   int references Categories(Id) 
                   on update cascade on delete cascade
    )
    
  5. ==============================

    5.

    create table question_bank
    (
        question_id uniqueidentifier primary key,
        question_exam_id uniqueidentifier not null constraint fk_exam_id foreign key references exams(exam_id),
        question_text varchar(1024) not null,
        question_point_value decimal
    );
    

    --That도 작동합니다. 아마도 더 직관적 인 구조를 비트?

  6. ==============================

    6.모든 테이블에 외래 키를 만들려면

    모든 테이블에 외래 키를 만들려면

    ALTER TABLE [SCHEMA].[TABLENAME] ADD FOREIGN KEY (COLUMNNAME) REFERENCES [TABLENAME](COLUMNNAME)
    EXAMPLE
    ALTER TABLE [dbo].[UserMaster] ADD FOREIGN KEY (City_Id) REFERENCES [dbo].[CityMaster](City_Id)
    
  7. ==============================

    7.당신은 쿼리가 다음을 시도 사용하여 관계를 두 테이블의 열을 만들려면 :

    당신은 쿼리가 다음을 시도 사용하여 관계를 두 테이블의 열을 만들려면 :

    Alter table Foreign_Key_Table_name add constraint 
    Foreign_Key_Table_name_Columnname_FK
    Foreign Key (Column_name) references 
    Another_Table_name(Another_Table_Column_name)
    
  8. ==============================

    8.당신처럼, 나는 보통 손으로 외래 키를 생성하지 않지만, 어떤 이유로 내가 스크립트를 필요로하는 경우 나는 보통, 나는 테이블 디자이너를 선택 변경됩니다 MS SQL 서버 관리 스튜디오를 사용하고 저장하기 전에 만들 수 있도록 할 | 변경 스크립트를 생성

    당신처럼, 나는 보통 손으로 외래 키를 생성하지 않지만, 어떤 이유로 내가 스크립트를 필요로하는 경우 나는 보통, 나는 테이블 디자이너를 선택 변경됩니다 MS SQL 서버 관리 스튜디오를 사용하고 저장하기 전에 만들 수 있도록 할 | 변경 스크립트를 생성

  9. ==============================

    9.이 스크립트는 외래 키가있는 테이블을 만드는 방법에 대해 내가 참조 무결성 제약 조건 SQL 서버를 추가했다.

    이 스크립트는 외래 키가있는 테이블을 만드는 방법에 대해 내가 참조 무결성 제약 조건 SQL 서버를 추가했다.

    create table exams
    (  
        exam_id int primary key,
        exam_name varchar(50),
    );
    
    create table question_bank 
    (
        question_id int primary key,
        question_exam_id int not null,
        question_text varchar(1024) not null,
        question_point_value decimal,
        constraint question_exam_id_fk
           foreign key references exams(exam_id)
                   ON DELETE CASCADE
    );
    
  10. ==============================

    10.Necromancing. 사실, 제대로이 일을하는 것은 조금 까다이다.

    Necromancing. 사실, 제대로이 일을하는 것은 조금 까다이다.

    먼저 기본 키는 참조로 외래 키를 설정 할 열이있는 경우 확인해야합니다.

    이 예에서, 테이블 T_ZO_SYS_Language_Forms에 외래 키가 생성되고, 참조 dbo.T_SYS_Language_Forms.LANG_UID

    -- First, chech if the table exists...
    IF 0 < (
        SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES 
        WHERE TABLE_TYPE = 'BASE TABLE'
        AND TABLE_SCHEMA = 'dbo'
        AND TABLE_NAME = 'T_SYS_Language_Forms'
    )
    BEGIN
        -- Check for NULL values in the primary-key column
        IF 0 = (SELECT COUNT(*) FROM T_SYS_Language_Forms WHERE LANG_UID IS NULL)
        BEGIN
            ALTER TABLE T_SYS_Language_Forms ALTER COLUMN LANG_UID uniqueidentifier NOT NULL 
    
            -- No, don't drop, FK references might already exist...
            -- Drop PK if exists 
            -- ALTER TABLE T_SYS_Language_Forms DROP CONSTRAINT pk_constraint_name 
            --DECLARE @pkDropCommand nvarchar(1000) 
            --SET @pkDropCommand = N'ALTER TABLE T_SYS_Language_Forms DROP CONSTRAINT ' + QUOTENAME((SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
            --WHERE CONSTRAINT_TYPE = 'PRIMARY KEY' 
            --AND TABLE_SCHEMA = 'dbo' 
            --AND TABLE_NAME = 'T_SYS_Language_Forms' 
            ----AND CONSTRAINT_NAME = 'PK_T_SYS_Language_Forms' 
            --))
            ---- PRINT @pkDropCommand 
            --EXECUTE(@pkDropCommand) 
    
            -- Instead do
            -- EXEC sp_rename 'dbo.T_SYS_Language_Forms.PK_T_SYS_Language_Forms1234565', 'PK_T_SYS_Language_Forms';
    
    
            -- Check if they keys are unique (it is very possible they might not be) 
            IF 1 >= (SELECT TOP 1 COUNT(*) AS cnt FROM T_SYS_Language_Forms GROUP BY LANG_UID ORDER BY cnt DESC)
            BEGIN
    
                -- If no Primary key for this table
                IF 0 =  
                (
                    SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
                    WHERE CONSTRAINT_TYPE = 'PRIMARY KEY' 
                    AND TABLE_SCHEMA = 'dbo' 
                    AND TABLE_NAME = 'T_SYS_Language_Forms' 
                    -- AND CONSTRAINT_NAME = 'PK_T_SYS_Language_Forms' 
                )
                    ALTER TABLE T_SYS_Language_Forms ADD CONSTRAINT PK_T_SYS_Language_Forms PRIMARY KEY CLUSTERED (LANG_UID ASC)
                ;
    
                -- Adding foreign key
                IF 0 = (SELECT COUNT(*) FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS WHERE CONSTRAINT_NAME = 'FK_T_ZO_SYS_Language_Forms_T_SYS_Language_Forms') 
                    ALTER TABLE T_ZO_SYS_Language_Forms WITH NOCHECK ADD CONSTRAINT FK_T_ZO_SYS_Language_Forms_T_SYS_Language_Forms FOREIGN KEY(ZOLANG_LANG_UID) REFERENCES T_SYS_Language_Forms(LANG_UID); 
            END -- End uniqueness check
            ELSE
                PRINT 'FSCK, this column has duplicate keys, and can thus not be changed to primary key...' 
        END -- End NULL check
        ELSE
            PRINT 'FSCK, need to figure out how to update NULL value(s)...' 
    END 
    
  11. ==============================

    11.난 항상 두 테이블 사이의 외래 키 제약 조건을 만들려면이 구문을 사용

    난 항상 두 테이블 사이의 외래 키 제약 조건을 만들려면이 구문을 사용

    Alter Table ForeignKeyTable
    Add constraint `ForeignKeyTable_ForeignKeyColumn_FK`
    `Foreign key (ForeignKeyColumn)` references `PrimaryKeyTable (PrimaryKeyColumn)`
    

    Alter Table tblEmployee
    Add constraint tblEmployee_DepartmentID_FK
    foreign key (DepartmentID) references tblDepartment (ID)
    
  12. from https://stackoverflow.com/questions/48772/how-do-i-create-a-foreign-key-in-sql-server by cc-by-sa and MIT license