삽입(SQL)

Insert (SQL)

SQL INSERT 문은 관계형 데이터베이스의 단일 테이블에 하나 이상의 레코드를 추가한다.null

기본형식

삽입 문장의 형식은 다음과 같다.

INSERT INTER 테이블(열1 [, 열2, 열3 ... ]) 값(값1 [, 값2, 값3 ... ])

열과 값의 수는 같아야 한다.열을 지정하지 않으면 열의 기본값이 사용된다.에 의해 지정된 값(또는 암시된 값)INSERT 문은 모든 적용 가능한 제약 조건(예: 기본 키, CHECK 제약 조건 및 NULL 제약 조건 아님)을 충족해야 한다.구문 오류가 발생하거나 제약 조건을 위반하면 새 행이 테이블에 추가되지 않고 오류가 반환된다.null

예:

삽입 INO phone_book (이름을 붙이다, 번호를 붙이다) 가치 ('존 도', '555-1212'); 

테이블이 만들어졌을 때 기둥의 순서를 이용하여 속기도 사용할 수 있다.다른 열은 기본값으로 설정되거나 null로 유지되므로 표의 모든 열을 지정할 필요는 없다.

 값에 삽입(값1, [값2, ... ])

phone_book 테이블의 두 열에 데이터를 삽입하고 테이블의 처음 두 열 뒤에 있을 수 있는 다른 열을 무시하는 예.null

삽입 INO phone_book 가치 ('존 도', '555-1212'); 

고급 양식

멀티로 인서트

SQL 기능(SQL-92 이후)은 행 값 생성자를 사용하여 한 번에 여러 행을 단일 SQL 문에 삽입하는 것이다.

삽입 INO 탭 이름 (칼럼을 세우다-a, [칼럼을 세우다-b, ...]) 가치 ('값-1a', ['값-1b', ...]),        ('값-2a', ['값-2b', ...]),        ... 

이 기능은 DB2, SQL Server (버전 10.0 - 즉 2008년 이후), PostgreSQL (버전 8.2 이후), MySQL, SQLite (버전 3.7.11 이후) 및 H2에서 지원된다.null

예('phone_book' 표의 열만 'name'과 'number'라고 가정할 경우):null

삽입 INO phone_book 가치 ('존 도', '555-1212'), ('피터 도', '555-2323'); 

두 진술의 속기라고 볼 수 있는 것

삽입 INO phone_book 가치 ('존 도', '555-1212'); 삽입 INO phone_book 가치 ('피터 도', '555-2323'); 

두 개의 별도 문장은 서로 다른 의미론(특히 문 트리거에 관한)을 가질 수 있으며 단일 다중 행 삽입과 동일한 성능을 제공하지 않을 수 있다는 점에 유의하십시오.null

MS SQL에 여러 행을 삽입하려면 다음과 같은 구성을 사용하십시오.

삽입 INO phone_book 선택 '존 도', '555-1212' 유니온 모두 선택 '피터 도', '555-2323'; 

불완전한 하위 선택 조항으로 인해 SQL 표준(SQL:2003)에 따른 유효한 SQL 문이 아니라는 점에 유의하십시오.null

Oracle에서 동일한 작업을 수행하려면 항상 단일 행으로만 구성된 DUAL 테이블을 사용하십시오.

삽입 INO phone_book 선택 '존 도', '555-1212' From 듀얼 유니온 모두 선택 '피터 도','555-2323' From 듀얼 

이 논리의 표준적합성 구현은 다음과 같은 예 또는 위와 같다.

삽입 INO phone_book 선택 '존 도', '555-1212' From 측면 ( 가치 (1) ) AS t(c) 유니온 모두 선택 '피터 도','555-2323' From 측면 ( 가치 (1) ) AS t(c) 

Oracle PL/SQL은 여러 삽입 문이 SELECT에 의해 종료되는 INSERT ALL 문을 지원한다.[1]

삽입 모두 INO phone_book 가치 ('존 도', '555-1212') INO phone_book 가치 ('피터 도', '555-2323') 선택 * From 듀얼; 

Firebird에서는 다음과 같이 여러 행을 삽입할 수 있다.

삽입 INO phone_book (이름을 붙이다, 번호를 붙이다) 선택 '존 도', '555-1212' From RDB$DATABASE 유니온 모두 선택 '피터 도', '555-2323' From RDB$DATABASE; 

그러나 파이어버드는 단일 질의에 사용할 수 있는 컨텍스트 수에는 한계가 있기 때문에 이런 식으로 삽입할 수 있는 것보다 행 수를 제한한다.null

다른 테이블에서 행 복사

INSERT 문장은 다른 테이블에서 데이터를 검색하고, 필요한 경우 수정하고, 테이블에 직접 삽입하는 데도 사용할 수 있다.이 모든 것은 클라이언트 애플리케이션의 중간 처리를 포함하지 않는 단일 SQL 문에서 이루어진다.VALUES 절 대신 하위 선택이 사용된다.하위 선택에는 조인, 함수 호출이 포함될 수 있으며, 데이터가 삽입된 동일한 테이블을 쿼리할 수도 있다.논리적으로 실제 삽입 작업이 시작되기 전에 선택 항목을 평가한다.예를 들면 다음과 같다.null

삽입 INO phone_book2 선택 * From   phone_book 어디에  이름을 붙이다  ('존 도', '피터 도') 

소스 테이블의 일부 데이터를 새 테이블로 삽입할 때는 변화가 필요하지만 전체 레코드가 아닌 경우(또는 테이블의 스키마가 동일하지 않을 경우)null

삽입 INO phone_book2 (이름을 붙이다, 번호를 붙이다) 선택 이름을 붙이다, 번호를 붙이다 From   phone_book 어디에  이름을 붙이다  ('존 도', '피터 도') 

SELECT 문은 (임시) 테이블을 생성하며, 해당 임시 테이블의 스키마는 데이터가 삽입된 테이블의 스키마와 일치해야 한다.null

기본값

모든 열의 기본값을 사용하여 데이터를 지정하지 않고 새 행을 삽입할 수 있다.그러나 일부 데이터베이스는 Microsoft SQL Server와 같이 데이터가 제공되지 않으면 이 문을 거부하며, 이 경우 DEFAULT 키워드를 사용할 수 있다.null

삽입 INO phone_book 가치 ( 체납 ) 

때때로 데이터베이스는 이에 대한 대체 구문도 지원한다. 예를 들어, MySQL은 기본 키워드를 생략하고 T-SQL은 VALUES(DEFAULES) 대신 기본값을 사용할 수 있다.또한 DEFAULT 키워드를 일반 삽입 시 사용하여 해당 열의 기본값을 사용하여 열을 명시적으로 채울 수 있다.

삽입 INO phone_book 가치 ( 체납, '555-1212' ) 

열이 기본값을 지정하지 않을 때 발생하는 동작은 데이터베이스에 의존한다.예를 들어 MySQL과 SQLite는 엄격한 모드에 있는 경우를 제외하고 빈 값으로 채워지며, 다른 많은 데이터베이스는 이 문을 거부한다.null

키 검색 중

모든 테이블의 기본 키로 대체 키를 사용하는 데이터베이스 설계자는 다른 SQL 문에 사용하기 위해 SQL INSERT 문에서 데이터베이스 생성 기본 키를 자동으로 검색해야 하는 시나리오에 직면하게 된다.대부분의 시스템은 SQL INSERT 문이 행 데이터를 반환하는 것을 허용하지 않는다.따라서 그러한 시나리오에서 해결 방법을 구현할 필요가 있다.일반적인 구현에는 다음이 포함된다.

  • 대체 키를 생성하고 INSERT 작업을 수행한 후 생성된 키를 최종적으로 반환하는 데이터베이스별 저장 프로시저를 사용하십시오.예를 들어 Microsoft SQL Server에서는 특수 함수를 통해 키를 검색하고 SQLite에서는 함수의 이름을 last_insert_rowid()로 지정한다.
  • 마지막으로 삽입된 행이 포함된 임시 테이블에서 데이터베이스별 선택 문 사용.DB2는 다음과 같은 방법으로 이 기능을 구현한다.
    선택 * From 새로운 테이블 (     삽입 INO phone_book     가치 ( '피터 도','555-2323' ) ) AS t 
    • DB2 for z/OS는 다음과 같은 방법으로 이 기능을 구현한다.null
      선택 EMPNO, 렌트타입, 렌터카이트 From 최종 테이블 (     삽입 INO EMPSAMP (이름, 급여, 뎁트노, 레벨)     가치('메리 스미스', 35000.00, 11, '어소시에이트') ); 
  • 가장 최근에 삽입된 행에 대해 생성된 기본 키를 반환하는 데이터베이스별 함수와 함께 INSERT 문 뒤에 SELECT 문 사용.예를 들어 MySQL의 경우 LAST_INSERT_ID()를 참조하십시오.
  • 후속 SELECT 문에서 원본 SQL INSERT의 고유한 요소 조합 사용.
  • SQL INSERT 문에서 GUID를 사용하고 SELECT 문에서 검색.
  • MS-SQL Server 2005 및 MS-SQL Server 2008에 대한 SQL INSERT 문의 OUTPUT 절 사용.
  • OracleRETURING 절과 함께 INSERT 문 사용.null
    삽입 INO phone_book 가치 ( '피터 도','555-2323' ) 돌아오는 phone_book_id INO v_pb_id 
  • PostgreSQL에 대한 RETURING 절과 함께 INSERT 문 사용(8.2 이후)반환된 목록은 INSERT의 결과와 동일하다.null
    • Firebird는 DSQL(Data Modify Language 문장)에서 구문이 동일하며, 이 문장은 최대 한 행을 추가할 수 있다.[2]저장 프로시저에서는 앞서 언급한 Oracle 구문을 트리거 및 실행 블록(PSQL)[3]
      삽입 INO phone_book 가치 ( '피터 도','555-2323' ) 돌아오는 phone_book_id 
  • H2IDENTY() 함수를 사용하면 마지막으로 삽입된 ID가 반환된다.null
    선택 아이덴티티(); 

트리거스

INSERT 문이 작동하는 테이블에 트리거가 정의되어 있는 경우, 그러한 트리거는 작동의 맥락에서 평가된다.INTERT 트리거를 실행하기 에 표에 삽입해야 하는 값을 수정할 수 있다.AFTER INSERT 트리거는 더 이상 데이터를 수정할 수 없지만, 예를 들어 감사 메커니즘을 구현하기 위한 다른 테이블의 작업을 시작하는 데 사용할 수 있다.null

참조

  1. ^ "Oracle PL/SQL: INSERT ALL". psoug.org. Retrieved 2010-09-02.
  2. ^ "Firebird 2.5 Language Reference Update". Retrieved 2011-10-24.
  3. ^ "Firebird SQL Language Dictionary".

외부 링크