Programming/Microsoft SQL Server
Insert는 Table에 Data를 추가하는 Query입니다.

먼저 Insert 구문의 Test를 위해 임시 Table을 생성하도록 하겠습니다.

Create Table #Product(
 Number Smallint,
 Name nChar(10),
 Price Int,
 RegDate DateTime
)


Table 이름 #Product에서 #은 생성하는 Table이 임시 Table이라는 것을 의미합니다.

1. Table의 모든 열에 Data 추가하기

Insert Into #Product
Values(0, '자전거', 50000, GetDate())

#Product Table에 존재하는 모든열에 Values에서 지정한 Data를 추가합니다.


#Product 임시Table에서 Number와 Price는 열 Data형이 정수형이므로 '와 '로 값을 지정하지 않았지만 Name은 nChar형(문자형)이므로 '와 '로 값을 지정하였습니다.

Insert Into #Product
Values('0', '자전거', 50000, GetDate())

위 예제에서는 정수형임에도 불구하고 '0'처럼 문자형으로 데이터를 지정하였습니다. 하지만 0이라는 문자도 정수형으로 변환될 수 있기때문에 정상적으로 처리되지만 되도록이면 Table의 열특성에 맞게끔 지정해 주는것이 성능면에서 더 좋은 선택이 될 것입니다.

참고로 위 Insert문에서 GetDate()는 현재시간(내 Computer가 아닌 Database Server시간 기준)을 출력하는 함수입니다.

위 그림에 보시면 Query로 인해 1개의 행이 영향을 받았음을 알려주고 있습니다. 그럼 어떻게 Data가 추가되었는지 확인해 보도록 하겠습니다.

Select * From #Product


참고로 SQL Server 2008부터는 다중 Insert가 가능하게 되었습니다. 이때는 데이터를 입력하는 괄호사이를 콤마(,)로 구분합니다.

Insert Into #Product Values
(0, '자동차', 300, GETDATE()),
(1, '비행기', 200, GETDATE());

2. 특정 열에만 Data 추가하기

위 Insert문에서 Values를 통해 값을 추가한 경우는 #Product 임시 Table에 존재하는 Number, Name, Price, RegDate 의 모든열에 Data를 추가하여야 하므로 해당 열 순서대로 값을 나열해야 했습니다.

이때 만일 Table에서 전체열이 아닌 특정열에만 Data를 추가하려면 Table명 옆에 추가하고자 하는 열을 지정해 주면 됩니다.

Insert Into #Product(Number, Name, RegDate)
Values(1, '자동차', GetDate())

#Product Table에서 Number, Name, RegDate열에만 지정한 Data를 추가합니다.


이제 Data가 어떤 식으로 처리되었는지 확인해 보도록 하겠습니다.

Select * From #Product


Insert에서 지정되지 않은 열은 자동적으로 Null처리가 됨을 알 수 있습니다.

3. Identity와 Default처리

Insert 하려는 테이블(Table)에 특정 컬럼(Column)이 Identity가 설정되어 있는 경우 해당 컬럼(Column)은 무시할 수 있습니다.

Create Table #Product(
 Number Smallint Identity,
 Name nChar(10),
 Price Int,
 RegDate DateTime
)


Insert Into #Product Values ('자동차', 300, GetDate());


만약 Identity값을 강제적으로 입력하고자 한다면 Identity_Insert 설정을 On으로 바꿔주고 해당 컬럼(Column)을 지정해 데이터를 Insert합니다.


Set Identity_Insert #Product On;

Insert Into #Product(Number, Name, Price, RegDate) Values (10, '자동차', 300, GetDate());


Default의 경우 Default로 설정된 값으로 Insert처리를 수행하고자 한다면 Insert에서 Default를 지정해 주기만 하면 됩니다.


Create Table #Product(
 Number Smallint,
 Name nChar(10) Default '자동차',
 Price Int,
 RegDate DateTime
)


Insert Into #Product Values(100, Default, 300, GetDate());


4. Table을 통한 Data 추가

Insert문은 Values를 통해 단일값만을 지정할 수 있는 것이 아니라 다른 Table의 Data를 원하는 만큼 추가할 수도 있습니다.

Test를 위해 임시Table을 하나더 생성합니다.

Create Table #Product2(
 Number Smallint,
 Name nChar(10),
 Price Int,
 RegDate DateTime
)

위에서 생성한 Table에 Data를 추가합니다.

Insert Into #Product2
Values(3, '비행기', 29900, GetDate())

추가된 Data를 확인합니다.

Select * From #Product2


이제 #Product2 Table에 있는 Data를 #Product Table에 추가하고 그 내용을 확인해 보도록 하겠습니다.

Insert Into #Product
Select * From #Product2

#Product2에 있는 모든 값을 #Product Table에 추가합니다.

Select * From #Product


Insert 구문을 통해 한 Table에서 다른 Table로 Data를 추가하려면 해당 Table의 열 형식이 일치하거나 Insert 구문에 있는 Table의 열 형식이 Select 구문에 있는 열 형식을 포함할 수 있어야 합니다.(포함되어야 한다는 것은 '1' 에서 1이나 1에서 '1'처럼 문자형에서 정수형으로 혹은 정수형에서 문자형으로 상호간 형변환이 가능해야 함을 의미합니다.)

Insert 와 Select를 통해 Data를 추가할 때에도 원하는 열만 추가할 수 있습니다.

Insert Into #Product(Number, Name)
Select Number, Name From #Product2

#Product2의 Number와 Name열의 Data를 #Product Table의 Number과 Name열에 추가합니다.


5. 다른 Table의 Data로 새로운 Table생성하기

Table을 통한 Data 추가는 이미 존재하는 Table에서 Data를 가져와 전혀 새로운 Table을 생성하는 방식으로 활용될 수 있습니다.

Select Number, Name, Price, RegDate
Into #Product3
From #Product

#Product의 Number, Name, Price, RegDate 열 Data를 불러와 #Product3 임시Table을 생성한뒤 불러온 Data를 담습니다.


Table과 Data가 정상적으로 생성되고 추가되었는지 확인해 보도록 하겠습니다.

Select * From #Product3


보시는 것처럼 #Product3 임시 Table이 생성되고 Data또한 정상적으로 추가되었음을 확인할 수 있으며 Into를 통한 Table 생성은 임시Table 뿐만 아니라 정상적인 Table생성도 가능합니다.


0 0