PRIMARY KEY 및 FOREIGN KEY 제약 조건Primary and Foreign Key Constraints

이 항목은 다음에 적용됩니다. 예SQL Server(2016부터)예Azure SQL Database아니요Azure SQL Data Warehouse아니요병렬 데이터 웨어하우스 THIS TOPIC APPLIES TO: yesSQL Server (starting with 2016)yesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

SQL ServerSQL Server 테이블에서 데이터 무결성을 강제 적용하는 데 사용할 수 있는 두 가지 유형의 제약 조건으로 기본 키와 외래 키가 있습니다.Primary keys and foreign keys are two types of constraints that can be used to enforce data integrity in SQL ServerSQL Server tables. 이들 키는 중요한 데이터베이스 개체입니다.These are important database objects.

이 항목에는 다음과 같은 섹션이 포함되어 있습니다.This topic contains the following sections.

기본 키 제약 조건Primary Key Constraints

Foreign Key ConstraintsForeign Key Constraints

관련 태스크Related Tasks

기본 키 제약 조건 Primary Key Constraints

테이블에는 일반적으로 테이블의 각 행을 고유하게 식별하는 값을 가진 열 또는 열 조합이 포함되어 있습니다.A table typically has a column or combination of columns that contain values that uniquely identify each row in the table. 이러한 열이나 열 조합은 테이블의 PK(기본 키)라고 하며 테이블에 엔터티 무결성을 적용합니다.This column, or columns, is called the primary key (PK) of the table and enforces the entity integrity of the table. 기본 키 제약 조건은 데이터의 고유성을 보장하므로 자주 ID 열에 정의됩니다.Because primary key constraints guarantee unique data, they are frequently defined on an identity column.

테이블에 대해 기본 키 제약 조건을 지정하면 데이터베이스 엔진Database Engine 은 기본 키 열에 대해 고유 인덱스를 자동으로 만들어 데이터 고유성을 적용합니다.When you specify a primary key constraint for a table, the 데이터베이스 엔진Database Engine enforces data uniqueness by automatically creating a unique index for the primary key columns. 또한 쿼리에서 기본 키가 사용되는 경우 이 인덱스를 사용하여 데이터에 빠르게 액세스할 수 있습니다.This index also permits fast access to data when the primary key is used in queries. 기본 키 제약 조건이 두 개 이상의 열에 정의되는 경우 한 열에 중복된 값이 있을 수 있지만 기본 키 제약 조건 정의에 있는 모든 열의 값 조합은 각각 고유해야 합니다.If a primary key constraint is defined on more than one column, values may be duplicated within one column, but each combination of values from all the columns in the primary key constraint definition must be unique.

다음 그림에서와 같이 Purchasing.ProductVendor 테이블의 ProductIDVendorID 열은 이 테이블에 대한 복합 기본 키 제약 조건을 구성합니다.As shown in the following illustration, the ProductID and VendorID columns in the Purchasing.ProductVendor table form a composite primary key constraint for this table. 그 결과 ProductVendor 테이블의 모든 열에서 ProductIDVendorID의 조합은 고유합니다.This makes sure that that every row in the ProductVendor table has a unique combination of ProductID and VendorID. 따라서 중복 행을 삽입할 수 없습니다.This prevents the insertion of duplicate rows.

복합 PRIMARY KEY 제약 조건Composite PRIMARY KEY constraint

  • 테이블은 하나의 기본 키 제약 조건만 포함할 수 있습니다.A table can contain only one primary key constraint.

  • 기본 키는 16개 열을 초과할 수 없으며 총 키 길이가 900바이트를 넘을 수 없습니다.A primary key cannot exceed 16 columns and a total key length of 900 bytes.

  • 기본 키 제약 조건에 의해 생성된 인덱스 수는 비클러스터형 인덱스 999개, 클러스터형 인덱스 1개인 테이블의 인덱스 수 제한을 초과할 수 없습니다.The index generated by a primary key constraint cannot cause the number of indexes on the table to exceed 999 nonclustered indexes and 1 clustered index.

  • 기본 키 제약 조건에 대해 클러스터형 또는 비클러스터형을 지정하지 않은 경우 테이블에 클러스터형 인덱스가 없으면 클러스터형이 사용됩니다.If clustered or nonclustered is not specified for a primary key constraint, clustered is used if there no clustered index on the table.

  • 기본 키 제약 조건 내에서 정의된 모든 열은 NOT NULL로 정의되어야 합니다.All columns defined within a primary key constraint must be defined as not null. NULL 허용 여부를 지정하지 않은 경우에는 기본 키 제약 조건에 참여하는 모든 열의 NULL 허용 여부가 NOT NULL로 설정됩니다.If nullability is not specified, all columns participating in a primary key constraint have their nullability set to not null.

  • CLR 사용자 정의 형식 열에 기본 키를 정의하는 경우 형식 구현이 이진 순서를 지원해야 합니다.If a primary key is defined on a CLR user-defined type column, the implementation of the type must support binary ordering.

Foreign Key Constraints Foreign Key Constraints

외래 키(FK)는 두 테이블의 데이터 간 연결을 설정하고 강제 적용하여 외래 키 테이블에 저장될 수 있는 데이터를 제어하는 데 사용되는 열입니다.A foreign key (FK) is a column or combination of columns that is used to establish and enforce a link between the data in two tables to control the data that can be stored in the foreign key table. 외래 키 참조에서는 한 테이블의 기본 키 값을 가지고 있는 열을 다른 테이블의 열이 참조할 때 두 테이블 간에 연결이 생성됩니다.In a foreign key reference, a link is created between two tables when the column or columns that hold the primary key value for one table are referenced by the column or columns in another table. 이때 두 번째 테이블에 추가되는 열이 외래 키가 됩니다.This column becomes a foreign key in the second table.

예를 들어 Sales.SalesOrderHeader 테이블에는 Sales.SalesPerson 테이블에 대한 외래 키 연결이 생성되는데 이는 판매 주문과 영업 사원 간에 논리적 관계가 있기 때문입니다.For example, the Sales.SalesOrderHeader table has a foreign key link to the Sales.SalesPerson table because there is a logical relationship between sales orders and salespeople. SalesOrderHeader 테이블의 SalesPersonID 열은 SalesPerson 테이블의 기본 키 열과 일치합니다.The SalesPersonID column in the SalesOrderHeader table matches the primary key column of the SalesPerson table. SalesOrderHeader 테이블의 SalesPersonID 열은 SalesPerson 테이블에 대한 외래 키입니다.The SalesPersonID column in the SalesOrderHeader table is the foreign key to the SalesPerson table. 이 외래 키 관계를 만들면 SalesPerson 테이블에 SalesPersonID 값이 없을 경우 SalesOrderHeader 테이블에 이 값을 삽입할 수 없습니다.By creating this foreign key relationship, a value for SalesPersonID cannot be inserted into the SalesOrderHeader table if it does not already exist in the SalesPerson table.

각 테이블은 최대 253개의 다른 테이블 및 열을 외래 키(나가는 참조)로 참조할 수 있습니다.A table can reference a maximum of 253 other tables and columns as foreign keys (outgoing references). SQL Server 2016SQL Server 2016 에서는 단일 테이블의 열을 참조할 수 있는 다른 테이블 및 열의 수 제한이 253에서 10,000으로 증가합니다. increases the limit for the number of other table and columns that can reference columns in a single table (incoming references), from 253 to 10,000. 단, 호환성 수준이 130 이상이어야 합니다. 이러한 참조 가능 테이블 및 열 수의 증가에는 다음과 같은 제한이 적용됩니다.(Requires at least 130 compatibility level.) The increase has the following restrictions:

  • 253개를 초과하는 외래 키 참조는 DELETE DML 작업에서만 지원됩니다.Greater than 253 foreign key references are only supported for DELETE DML operations. UPDATE 및 MERGE 작업은 지원되지 않습니다.UPDATE and MERGE operations are not supported.

  • 자기 자신에 대한 외래 키 참조가 포함된 테이블은 계속 253개의 외래 키 참조만 사용할 수 있습니다.A table with a foreign key reference to itself is still limited to 253 foreign key references.

  • columnstore 인덱스, 메모리 액세스에 최적화된 테이블, 스트레치 데이터베이스 또는 분할된 외래 키 테이블에 대해서는 현재 253개보다 많은 외래 키 참조를 포함할 수 없습니다.Greater than 253 foreign key references are not currently available for columnstore indexes, memory-optimized tables, Stretch Database, or partitioned foreign key tables.

FOREIGN KEY 제약 조건에 대한 인덱스Indexes on Foreign Key Constraints

기본 키 제약 조건과 달리 외래 키 제약 조건을 만들어도 해당 인덱스가 자동으로 생성되지 않습니다.Unlike primary key constraints, creating a foreign key constraint does not automatically create a corresponding index. 그러나 외래 키에 대해 인덱스를 수동으로 만들면 다음과 같은 경우 유용합니다.However, manually creating an index on a foreign key is often useful for the following reasons:

  • 외래 키 열은 쿼리에서 한 테이블의 외래 키 제약 조건 열을 다른 테이블의 기본 또는 고유 키 열과 연결하여 테이블의 데이터를 병합하는 조인에서 자주 사용됩니다.Foreign key columns are frequently used in join criteria when the data from related tables is combined in queries by matching the column or columns in the foreign key constraint of one table with the primary or unique key column or columns in the other table. 데이터베이스 엔진Database Engine 에서는 인덱스를 만들어 외래 키 테이블에 있는 관련 데이터를 빠르게 찾을 수 있습니다.An index enables the 데이터베이스 엔진Database Engine to quickly find related data in the foreign key table. 그러나 반드시 인덱스를 만들 필요는 없습니다.However, creating this index is not required. 테이블 간에 기본 키 또는 외래 키 제약 조건이 정의되지 않더라도 관련된 두 테이블의 데이터를 결합할 수 있습니다. 그러나 두 테이블 간 외래 키 관계가 설정되면 키를 기준으로 하는 쿼리에서 결합할 때 최적화될 수 있습니다.Data from two related tables can be combined even if no primary key or foreign key constraints are defined between the tables, but a foreign key relationship between two tables indicates that the two tables have been optimized to be combined in a query that uses the keys as its criteria.

  • 기본 키 제약 조건이 변경되면 연결된 테이블의 외래 키 제약 조건도 검사합니다.Changes to primary key constraints are checked with foreign key constraints in related tables.

참조 무결성Referential Integrity

외래 키 제약 조건의 기본 목적이 외래 키 테이블에 저장되는 데이터를 제어하는 것이지만 기본 키 테이블의 데이터 변경 사항도 제어할 수 있습니다.Although the main purpose of a foreign key constraint is to control the data that can be stored in the foreign key table, it also controls changes to data in the primary key table. 예를 들어 한 영업 사원에 대한 행이 Sales.SalesPerson 테이블에서 삭제되었는데 이 영업 사원의 ID가 Sales.SalesOrderHeader 테이블의 판매 주문에 사용된 경우 두 테이블 간의 관계 무결성이 손상됩니다. SalesPerson 테이블의 데이터에 대한 연결이 끊어졌으므로 삭제된 영업 사원의 판매 주문은 SalesOrderHeader 테이블에서 고아 항목이 됩니다.For example, if the row for a salesperson is deleted from the Sales.SalesPerson table, and the salesperson's ID is used for sales orders in the Sales.SalesOrderHeader table, the relational integrity between the two tables is broken; the deleted salesperson's sales orders are orphaned in the SalesOrderHeader table without a link to the data in the SalesPerson table.

외래 키 제약 조건은 이런 상황이 발생되지 않도록 합니다.A foreign key constraint prevents this situation. 이 제약 조건은 기본 키 테이블의 데이터를 변경할 때 외래 키 테이블에 있는 데이터로의 연결이 무효화될 가능성이 있으면 그 데이터를 변경하지 못하도록 하여 참조 무결성을 강제 적용합니다.The constraint enforces referential integrity by guaranteeing that changes cannot be made to data in the primary key table if those changes invalidate the link to data in the foreign key table. 삭제되거나 변경되는 기본 키 값이 다른 테이블의 외래 키 제약 조건 값과 연결되어 있으면 기본 키 테이블의 행을 삭제하거나 기본 키 값을 변경하려는 동작이 수행되지 않습니다.If an attempt is made to delete the row in a primary key table or to change a primary key value, the action will fail when the deleted or changed primary key value corresponds to a value in the foreign key constraint of another table. 외래 키 제약 조건의 행을 제대로 변경하거나 삭제하려면 먼저 외래 키 테이블에 있는 외래 키 데이터를 삭제하거나 변경하여 외래 키를 다른 기본 키 데이터에 연결해야 합니다.To successfully change or delete a row in a foreign key constraint, you must first either delete the foreign key data in the foreign key table or change the foreign key data in the foreign key table, which links the foreign key to different primary key data.

연계 참조 무결성Cascading Referential Integrity

연계 참조 무결성 제약 조건을 사용하면 기존 외래 키가 가리키는 키를 사용자가 삭제 또는 업데이트하려 할 때 데이터베이스 엔진Database Engine 에서 수행할 동작을 정의할 수 있습니다.By using cascading referential integrity constraints, you can define the actions that the 데이터베이스 엔진Database Engine takes when a user tries to delete or update a key to which existing foreign keys point. 다음과 같은 연계 동작을 정의할 수 있습니다.The following cascading actions can be defined.

NO ACTIONNO ACTION
데이터베이스 엔진Database Engine 에서는 오류가 발생하며 부모 테이블의 행에 대한 삭제 또는 업데이트 동작이 롤백됩니다.The 데이터베이스 엔진Database Engine raises an error and the delete or update action on the row in the parent table is rolled back.

CASCADECASCADE
부모 테이블에서 해당 행이 업데이트되거나 삭제될 때 참조 테이블에서도 해당 행이 업데이트 또는 삭제됩니다.Corresponding rows are updated or deleted in the referencing table when that row is updated or deleted in the parent table. timestamp 열이 외래 키 또는 참조되는 키의 일부인 경우에는 CASCADE를 지정할 수 없습니다.CASCADE cannot be specified if a timestamp column is part of either the foreign key or the referenced key. INSTEAD OF DELETE 트리거가 있는 테이블에는 ON DELETE CASCADE를 지정할 수 없습니다.ON DELETE CASCADE cannot be specified for a table that has an INSTEAD OF DELETE trigger. INSTEAD OF UPDATE 트리거가 있는 테이블에 대해서는 ON UPDATE CASCADE를 지정할 수 없습니다.ON UPDATE CASCADE cannot be specified for tables that have INSTEAD OF UPDATE triggers.

SET NULLSET NULL
부모 테이블에서 행을 업데이트하거나 삭제하면 해당 외래 키를 구성하는 모든 값이 NULL로 설정됩니다.All the values that make up the foreign key are set to NULL when the corresponding row in the parent table is updated or deleted. 이 제약 조건을 실행하려면 외래 키 열이 Null을 허용해야 합니다.For this constraint to execute, the foreign key columns must be nullable. INSTEAD OF UPDATE 트리거가 있는 테이블에 대해서는 지정할 수 없습니다.Cannot be specified for tables that have INSTEAD OF UPDATE triggers.

SET DEFAULTSET DEFAULT
부모 테이블에서 해당 행을 업데이트하거나 삭제하면 외래 키를 구성하는 모든 값이 기본값으로 설정됩니다.All the values that make up the foreign key are set to their default values if the corresponding row in the parent table is updated or deleted. 이 제약 조건을 실행하려면 모든 외래 키 열에 기본 정의가 있어야 합니다.For this constraint to execute, all foreign key columns must have default definitions. 열이 Null을 허용하고 명시적 기본값이 설정되어 있지 않은 경우 NULL은 해당 열의 암시적 기본값이 됩니다.If a column is nullable, and there is no explicit default value set, NULL becomes the implicit default value of the column. INSTEAD OF UPDATE 트리거가 있는 테이블에 대해서는 지정할 수 없습니다.Cannot be specified for tables that have INSTEAD OF UPDATE triggers.

CASCADE, SET NULL, SET DEFAULT 및 NO ACTION은 서로 참조 관계를 가진 테이블에서 결합될 수 있습니다.CASCADE, SET NULL, SET DEFAULT and NO ACTION can be combined on tables that have referential relationships with each other. 데이터베이스 엔진Database Engine 이 NO ACTION을 발견하면 관련된 CASCADE, SET NULL 및 SET DEFAULT 동작을 멈추고 롤백합니다.If the 데이터베이스 엔진Database Engine encounters NO ACTION, it stops and rolls back related CASCADE, SET NULL and SET DEFAULT actions. DELETE 문으로 CASCADE, SET NULL, SET DEFAULT 및 NO ACTION 동작을 결합하면 데이터베이스 엔진Database Engine 이 NO ACTION을 확인하기 전에 모든 CASCADE, SET NULL 및 SET DEFAULT 동작을 적용합니다.When a DELETE statement causes a combination of CASCADE, SET NULL, SET DEFAULT and NO ACTION actions, all the CASCADE, SET NULL and SET DEFAULT actions are applied before the 데이터베이스 엔진Database Engine checks for any NO ACTION.

트리거 및 연계 참조 동작Triggers and Cascading Referential Actions

연계 참조 동작은 다음과 같은 방식으로 AFTER UPDATE 또는 AFTER DELETE 트리거를 시작합니다.Cascading referential actions fire the AFTER UPDATE or AFTER DELETE triggers in the following manner:

  • 원래 DELETE 또는 UPDATE 문에 의해 직접적으로 시작된 모든 연계 참조 동작이 먼저 수행됩니다.All the cascading referential actions directly caused by the original DELETE or UPDATE are performed first.

  • 영향을 받는 테이블에 AFTER 트리거가 정의되어 있는 경우 해당 트리거는 모든 연계 동작이 수행된 후에 시작됩니다.If there are any AFTER triggers defined on the affected tables, these triggers fire after all cascading actions are performed. 이 트리거는 연계 동작 순서와 반대로 시작됩니다.These triggers fire in opposite order of the cascading action. 단일 테이블에 여러 트리거가 있는 경우 이 테이블에 첫 번째 또는 마지막으로 지정된 트리거가 없다면 임의의 순서로 시작됩니다.If there are multiple triggers on a single table, they fire in random order, unless there is a dedicated first or last trigger for the table. 이 시작 순서는 sp_settriggerorder를 사용하여 지정한 대로 수행됩니다.This order is as specified by using sp_settriggerorder.

  • UPDATE 또는 DELETE 동작의 직접적인 대상인 테이블로부터 여러 연계 체인이 시작되는 경우 이 체인이 각 트리거를 시작하는 순서는 지정되지 않습니다.If multiple cascading chains originate from the table that was the direct target of an UPDATE or DELETE action, the order in which these chains fire their respective triggers is unspecified. 그러나 항상 한 체인이 해당 트리거를 모두 시작한 후에 다른 체인이 해당 트리거를 시작합니다.However, one chain always fires all its triggers before another chain starts firing.

  • UPDATE 또는 DELETE 동작의 직접적인 대상인 테이블에 대한 AFTER 트리거는 영향을 받는 행이 있는지 여부에 관계 없이 항상 시작됩니다.An AFTER trigger on the table that is the direct target of an UPDATE or DELETE action fires regardless of whether any rows are affected. 이 경우 다른 테이블은 연계 작업에 영향을 받지 않습니다.There are no other tables affected by cascading in this case.

  • 이전 트리거 중 하나가 다른 테이블에 대해 UPDATE 또는 DELETE 작업을 수행하는 경우 이 동작에 의해 보조 연계 체인이 시작될 수 있습니다.If any one of the previous triggers perform UPDATE or DELETE operations on other tables, these actions can start secondary cascading chains. 이러한 보조 체인은 기본 체인의 모든 트리거가 시작된 후에 각 UPDATE 또는 DELETE 작업에서 처리됩니다.These secondary chains are processed for each UPDATE or DELETE operation at a time after all triggers on all primary chains fire. 이러한 과정은 나중에 수행되는 UPDATE 또는 DELETE 작업에서 재귀적으로 반복될 수 있습니다.This process may be recursively repeated for subsequent UPDATE or DELETE operations.

  • 트리거 내에서 CREATE, ALTER, DELETE 또는 기타 DDL(데이터 정의 언어) 작업이 수행되면 DDL 트리거가 시작될 수 있습니다.Performing CREATE, ALTER, DELETE, or other data definition language (DDL) operations inside the triggers may cause DDL triggers to fire. 그리고 추가 연계 체인과 트리거를 시작하는 DELETE 또는 UPDATE 작업이 뒤이어 수행될 수 있습니다.This may subsequently perform DELETE or UPDATE operations that start additional cascading chains and triggers.

  • 특정 연계 참조 동작 체인 내에서 오류가 생성되면 오류가 발생하고 해당 체인에서 AFTER 트리거가 시작되지 않으며 체인을 만든 DELETE 또는 UPDATE 작업이 롤백됩니다.If an error is generated inside any particular cascading referential action chain, an error is raised, no AFTER triggers are fired in that chain, and the DELETE or UPDATE operation that created the chain is rolled back.

  • INSTEAD OF 트리거가 있는 테이블은 연계 동작을 지정하는 REFERENCES 절도 가질 수 없습니다.A table that has an INSTEAD OF trigger cannot also have a REFERENCES clause that specifies a cascading action. 그러나 연계 동작의 대상이 되는 테이블의 AFTER 트리거는 다른 테이블 또는 그 개체에 정의된 INSTEAD OF 트리거를 시작하는 뷰에서 INSERT, UPDATE 또는 DELETE 문을 실행할 수 있습니다.However, an AFTER trigger on a table targeted by a cascading action can execute an INSERT, UPDATE, or DELETE statement on another table or view that fires an INSTEAD OF trigger defined on that object.

다음 표에서는 기본 키 및 외래 키 제약 조건과 연관된 일반 태스크를 보여 줍니다.The following table lists the common tasks associated with primary key and foreign key constraints.

태스크Task 항목Topic
기본 키를 만드는 방법에 대해 설명합니다.Describes how to create a primary key. 기본 키 만들기Create Primary Keys
기본 키를 삭제하는 방법에 대해 설명합니다.Describes how to delete a primary key. 기본 키 삭제Delete Primary Keys
기본 키를 수정하는 방법에 대해 설명합니다.Describes how to modify a primary key. 기본 키 수정Modify Primary Keys
외래 키 관계를 만드는 방법에 대해 설명합니다.Describes how to create foreign key relationships 외래 키 관계 만들기Create Foreign Key Relationships
외래 키 관계를 수정하는 방법에 대해 설명합니다.Describes how to modify foreign key relationships. 외래 키 관계 수정Modify Foreign Key Relationships
외래 키 관계를 삭제하는 방법에 대해 설명합니다.Describes how to delete foreign key relationships. 외래 키 관계 삭제Delete Foreign Key Relationships
외래 키 속성을 보는 방법에 대해 설명합니다.Describes how to view foreign key properties. 외래 키 속성 보기View Foreign Key Properties
복제에 대한 외래 키 제약 조건을 사용하지 않도록 설정하는 방법에 대해 설명합니다.Describes how to disable foreign key constraints for replication. 복제할 때 FOREIGN KEY 제약 조건 비활성화Disable Foreign Key Constraints for Replication
INSERT 또는 UPDATE 문 중에 외래 키 제약 조건을 사용하지 않도록 설정하는 방법에 대해 설명합니다.Describes how to disable foreign key constraints during an INSERT or UPDATE statement. NSERT 및 UPDATE 문에서 FOREIGN KEY 제약 조건 사용 안 함Disable Foreign Key Constraints with INSERT and UPDATE Statements