문제

나는 절대로"손으로 코딩"객체를 작성하는 코드에 대한 SQL 서버 및 외국인 핵심 decleration 은 겉으로 다른 사이의 SQL 서버 및 Postgres.여기에 내에는 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
);

때 나는 쿼리를 실행하고 나는 이 오류가 발생할 수 있습니다.

Msg8 천 1 백 39,수 16,상태 0,선 9 수에서 열을 참조 외국인 핵심에서 다릅니다 숫자의 참조되는 열을,테이블 'question_bank'.

발견 할 수 있습니 오류가?

도움이 되었습니까?

해결책

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)
);

다른 팁

그리고 당신은 그냥을 만들려고 하는 제약 조건을 자체에서 사용할 수 있습니다 ALTER TABLE

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

나는 권장하지 않는 구문으로 언급 Sara Chipps 인 창조기 때문에,나는 오히려 이름을 내 자신의 제약 조건이 있습니다.

할 수도 있습니다 이름의 외국인 핵심 제약 조건을 사용하여 사용:

CONSTRAINT your_name_here FOREIGN KEY (question_exam_id) REFERENCES EXAMS (exam_id)

나는 다음과 같 AlexCuse 의 대답은,하지만 뭔가를 해야에 관심을 지불할 때마다 추가 외국인 핵심 제약 조건을 원하는 방법입 업데이트를 참조되는 열의 행에서 참조되는 테이블을 처리하고,특히 어떻게 당신이 원하는 삭제 행에서 참조되는 테이블을 취급합니다.

제약 조건을 만드는 경우가 만든 다음과 같다:

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

..그 후 업데이트 및 삭제에서는 부모 테이블될 것입 업데이트 및 삭제의 해당 행에서 참조하는 테이블.

(난 기본 변경해야 하는 기본 잘못한 주의 측면에는 좋다.나는 그냥 말하는 뭔가가 사람을 만드는 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
)
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
);

--는 작동합니다.Pehaps 좀 더 직관적 인을 구축?

을 만들려면 두 테이블의 열로의 관계를 쿼리를 사용하여 다음과 같이 하십시오.

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)

을 만드는 외국에서 키 테이블

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)

당신처럼,나는 일반적으로 하지 않을 만들 외국 열쇠를 손으로,그러나 몇 가지 이유로 내가 필요로 하는 스크립트를 수행 그래서 일반적으로 그것을 만들 ms 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
);

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 
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top