[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.
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.당신은 그냥 그 자체에 제약 조건을 만들려면, 당신은 ALTER TABLE을 사용할 수 있습니다
당신은 그냥 그 자체에 제약 조건을 만들려면, 당신은 ALTER TABLE을 사용할 수 있습니다
alter table MyTable add constraint MyTable_MyColumn_FK FOREIGN KEY ( MyColumn ) references MyOtherTable(PKColumn)
차라리 내 자신의 제약 조건의 이름을 하듯 때문에, 인라인 생성에 사라 Chipps 언급 구문을 권하고 싶지 않다.
-
==============================
3.또한 사용하여 외래 키 제약 조건의 이름을 지정할 수 있습니다 :
또한 사용하여 외래 키 제약 조건의 이름을 지정할 수 있습니다 :
CONSTRAINT your_name_here FOREIGN KEY (question_exam_id) REFERENCES EXAMS (exam_id)
-
==============================
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.
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.모든 테이블에 외래 키를 만들려면
모든 테이블에 외래 키를 만들려면
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.당신은 쿼리가 다음을 시도 사용하여 관계를 두 테이블의 열을 만들려면 :
당신은 쿼리가 다음을 시도 사용하여 관계를 두 테이블의 열을 만들려면 :
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.당신처럼, 나는 보통 손으로 외래 키를 생성하지 않지만, 어떤 이유로 내가 스크립트를 필요로하는 경우 나는 보통, 나는 테이블 디자이너를 선택 변경됩니다 MS SQL 서버 관리 스튜디오를 사용하고 저장하기 전에 만들 수 있도록 할 | 변경 스크립트를 생성
당신처럼, 나는 보통 손으로 외래 키를 생성하지 않지만, 어떤 이유로 내가 스크립트를 필요로하는 경우 나는 보통, 나는 테이블 디자이너를 선택 변경됩니다 MS SQL 서버 관리 스튜디오를 사용하고 저장하기 전에 만들 수 있도록 할 | 변경 스크립트를 생성
-
==============================
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.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.난 항상 두 테이블 사이의 외래 키 제약 조건을 만들려면이 구문을 사용
난 항상 두 테이블 사이의 외래 키 제약 조건을 만들려면이 구문을 사용
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)
from https://stackoverflow.com/questions/48772/how-do-i-create-a-foreign-key-in-sql-server by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 큰 데이터베이스의 빠른에서 중복을 제거 MYSQL (0) | 2020.04.06 |
---|---|
[SQL] SQL Server 2008의 선택 쿼리 결과에서 테이블을 만드는 방법 [중복] (0) | 2020.04.05 |
[SQL] 서로 값을 하나 개의 MySQL의 테이블을 업데이트 (0) | 2020.04.05 |
[SQL] 자바의 SQL 문자열을 구축 깨끗한 방법 (0) | 2020.04.05 |
[SQL] 왜 사람들이 너무 많은 SQL 커서를 싫어합니까? [닫은] (0) | 2020.04.05 |