sqlite에 자동 증가가 있습니까?


109

Sqlite3primary key 에서 자동 증가 기능이있는 테이블을 만들려고합니다 . 이것이 실제로 가능한지 확실하지 않지만 다른 필드 만 지정하면되기를 바랍니다.

예를 들면 :

CREATE TABLE people (id integer primary key auto increment, first_name varchar(20), last_name varchar(20));

그런 다음 값을 추가 할 때 다음 작업 만 수행하면되기를 바랐습니다.

INSERT INTO people
VALUES ("John", "Smith");

이것이 가능할까요?

Windows 7에서 실행 sqlite3cygwin입니다.

답변:


167

ROWID라는 이름을 무료로받을 수 있습니다. 요청 여부에 관계없이 모든 SQLite 테이블에 있습니다.

INTEGER PRIMARY KEY 유형의 열을 포함하는 경우 해당 열은 자동 ROWID 열을 가리 킵니다 (별명 임).

예상대로 행을 삽입 할 때마다 ROWID (이름에 관계없이)에 값이 할당됩니다. INSERT에 NULL이 아닌 값을 명시 적으로 할당하면 자동 증가 대신 지정된 값을 가져옵니다. INSERT에 명시 적으로 NULL 값을 지정하면 다음 자동 증가 값을 가져옵니다.

또한 다음을 피해야합니다.

 INSERT INTO people VALUES ("John", "Smith");

그리고 사용

 INSERT INTO people (first_name, last_name) VALUES ("John", "Smith");

대신. 첫 번째 버전은 매우 취약합니다. 테이블 정의에서 열을 추가, 이동 또는 삭제하면 INSERT가 실패하거나 잘못된 데이터 (잘못된 열의 값 포함)를 생성합니다.


53
ROWID는 SAME 값이 두 번 이상 생성 될 수 있으므로 실제 자동 증가와 완전히 동일하지 않습니다. 예를 들어, 빈 테이블에서 3 개의 행을 삽입하면 예상대로 3 번째 행에 3의 ROWID가 제공됩니다. 그러나 두 행을 삽입하고 마지막 행을 삭제하고 다른 행을 삽입하면 두 번째 행과 마찬가지로 세 번째 삽입 행에 2의 ROWID가 제공됩니다. 따라서 테이블이 삭제가 발생하는 테이블에서 ROWID를 참조하고 관련 테이블에서도 삭제 또는 ROWID 널링이 수행되지 않는 경우 명백한 심각한 문제가 있습니다.
Nick

10
답변에서 명확하지 않은 경우 select 문에 ROWID를 사용할 수 있습니다. 예select rowid from people;
Colin D

@Nick은 당신의 아이디어를 보완하기 위해 : 그래서 자동 증가는 안전 조치입니다. 그리고 우리는 ROWID에서 충돌하는 두 행에 대해 말하는 것이 아닙니다.
YoussefDir

69

네, 가능합니다. SQLite FAQ 에 따르면 :

선언 된 열 INTEGER PRIMARY KEY은 자동 증가합니다.


12
Uku에서 언급하고 문서에서도 설명했듯이주의 할 점은이 작업을 수행하려면 ID에 대해 NULL을 전달해야한다는 것입니다.
Matt Hulse 2011 년

22
당신은 필요 결코 좋은 연습 - 당신이 INSERT에 열 목록을 떠날 경우 NULL을 사용 할 수 있습니다. 열을 지정하는 경우 자동 증가 열을 생략하면 다음 값을 받게됩니다.
Larry Lustig

5
또 다른주의 사항 : 위에 주어진대로 정확하게 "INTEGER ..."를 작성하십시오. 속기 "INT ..."는 작동하지 않습니다.
Marcin Wojnarski

27

오늘 기준 — 2018 년 6 월


다음은 공식 SQLite 문서 가 주제에 대해 말하는 내용입니다 (굵게 및 기울임 꼴은 내 것임).

  1. 자동 증가 키워드 강요하며 여분의 CPU, 메모리, 디스크 공간, 디스크 I / O 오버 헤드 및 엄격하게 필요하지 않은 경우에는 피해야한다. 일반적으로 필요하지 않습니다.

  2. SQLite에서 INTEGER PRIMARY KEY 유형의 열 은 항상 64 비트 부호있는 정수인 ROWID (WITHOUT ROWID 테이블 제외 )의 별칭입니다 .

  3. INSERT 에서 ROWID 또는 INTEGER PRIMARY KEY 열에 명시 적으로 값이 지정 되지 않은 경우 일반적으로 현재 사용 중인 가장 큰 ROWID보다 하나 더 많은 사용되지 않는 정수로 자동으로 채워집니다 . 이것은 AUTOINCREMENT 키워드 사용 여부에 관계없이 적용됩니다.

  4. 경우 자동 증가 키워드가 나타납니다 INTEGER PRIMARY KEY 이후 에 자동 ROWID 할당 알고리즘을 변경, 재사용 방지 데이터베이스의 수명 기간 동안의 ROWID의를. 즉, AUTOINCREMENT의 목적은 이전에 삭제 된 행에서 ROWID의 재사용을 방지하는 것입니다.


11

읽어 보셨나요? AUTOINCREMENT 필드는 어떻게 생성합니까?

INSERT INTO people
VALUES (NULL, "John", "Smith");

그래서 당신이 말하는 것은 내가하려는 것은 불가능하지만 시뮬레이션은 할 수 있다는 것입니다. 삽입에 null을 사용해야합니까?
ewok

1
아무것도 할 필요가 없지만 항상 ID로 NULL을 삽입하고 sqlite가 내부적으로 어떻게 수행하는지 설명합니다.
Uku Loskit 2011 년

7
INSERT의 NULL은 INSERT 에 열 목록을 지정하지 않은 경우 에만 필요합니다 (이 경우 열 수와 정확히 일치하는 여러 값이 필요하고 자리 표시 자로 NULL을 사용해야 함). 그러나 열 목록을 지정하지 않고 INSERT를 수행하는 것은 결코 좋은 방법이 아닙니다. 열 목록을 지정하는 경우 자동 증가 열과 NULL 값을 모두 제외하면 예상 한 결과를 얻을 수 있습니다.
Larry Lustig

4

AUTOINCREMENT근처에 키워드를 지정하면 안됩니다 PRIMARY KEY. 자동 증가 기본 키 생성 및 삽입의 예 :

$ sqlite3 ex1

CREATE TABLE IF NOT EXISTS room(room_id INTEGER PRIMARY KEY, name VARCHAR(25) NOT NULL, home_id VARCHAR(25) NOT NULL);

INSERT INTO room(name, home_id) VALUES ('test', 'home id test');

INSERT INTO room(name, home_id) VALUES ('test 2', 'home id test 2');

SELECT * FROM room;

줄게:

1|test|home id test
2|test 2|home id test 2

4

rowid 외에 고유 한 자동 증가 필드를 정의 할 수 있지만 권장되지 않습니다. 자동으로 증가하는 rowid를 사용할 때 항상 더 나은 솔루션입니다.

AUTOINCREMENT키워드 강요하며 여분의 CPU, 메모리, 디스크 공간, 디스크 I / O 오버 헤드 엄격하게 필요하지 않은 경우에는 피해야한다. 일반적으로 필요하지 않습니다.

읽기 여기에 자세한 내용을 참조하십시오.


분명히 ROWID는 항상 자동으로 닉에 의해 코멘트를 참조 증가하지 않는다
rogerdpack

1
사실이 아니다. 자동 증가는 ID를 재사용하지 않기 때문에 일부 측면에서 더 좋습니다. 이는 많은 시스템에서 매우 중요한 요구 사항입니다.
O'Rooney

4

SQLite AUTOINCREMENT는 테이블의 필드 값을 자동으로 증가시키는 데 사용되는 키워드입니다. 특정 컬럼 이름으로 테이블을 생성 할 때 AUTOINCREMENT 키워드를 사용하여 필드 값을 자동 증가시켜 자동 증가시킬 수 있습니다.

AUTOINCREMENT 키워드는 INTEGER 필드에서만 사용할 수 있습니다. 통사론:

AUTOINCREMENT 키워드의 기본 사용법은 다음과 같습니다.

CREATE TABLE table_name(
   column1 INTEGER AUTOINCREMENT,
   column2 datatype,
   column3 datatype,
   .....
   columnN datatype,
);

예를 들어 아래를 참조하십시오. COMPANY 테이블이 다음과 같이 생성되는 것을 고려하십시오.

sqlite> CREATE TABLE TB_COMPANY_INFO(
   ID INTEGER PRIMARY KEY   AUTOINCREMENT,
   NAME           TEXT      NOT NULL,
   AGE            INT       NOT NULL,
   ADDRESS        CHAR(50),
   SALARY         REAL
);

이제 TB_COMPANY_INFO 테이블에 다음 레코드를 삽입합니다.

INSERT INTO TB_COMPANY_INFO (NAME,AGE,ADDRESS,SALARY)
VALUES ( 'MANOJ KUMAR', 40, 'Meerut,UP,INDIA', 200000.00 );

이제 레코드를 선택하십시오

SELECT *FROM TB_COMPANY_INFO
ID      NAME            AGE     ADDRESS             SALARY
1       Manoj Kumar     40      Meerut,UP,INDIA     200000.00

2

이 답변이 조금 늦었다는 것을 알고 있습니다.
이 답변에 대한 나의 목적은 현재 또는 미래에 SQLite에서 이러한 유형의 도전에 직면하고 어려움을 겪고있는 모든 사람이 참조하는 것입니다.

이제 쿼리를 다시 살펴보면 다음과 같아야합니다.

CREATE TABLE people (id integer primary key autoincrement, first_name varchar(20), last_name varchar(20));

내 쪽에서 작동합니다. 그렇게

여기에 이미지 설명 입력

SQLite로 작업하는 경우 DB Browser for SQLite 를 확인하는 것이 좋습니다 . 다른 플랫폼에서도 작동합니다.


0

당신이하는 일은 정확하지만 '자동 증가'에 대한 올바른 구문은 공백이 없어야합니다.

CREATE TABLE people (id integer primary key autoincrement, first_name string, last_name string);

(또한 내가 varchar를 문자열로 변경했습니다. 그 이유는 SQLite가 내부적으로 varchar를 문자열로 변환하기 때문입니다. 그래서 왜 귀찮습니까?)

그런 다음 삽입은 가능한 한 표준 SQL 언어로 작성되어야합니다.

INSERT INTO people(id, first_name, last_name) VALUES (null, 'john', 'doe');

id를 생략하면 자동으로 증가하고 할당되는 것이 사실이지만, 개인적으로 앞으로 변경 될 수있는 자동 메커니즘에 의존하지 않는 것을 선호합니다.

자동 증가에 대한 참고 사항 : 많은 사람들이 지적했듯이 SQLite 사용자는 권장하지 않지만 자동 증가를 사용하지 않으면 삭제 된 레코드의 ID를 자동으로 재사용하는 것을 좋아하지 않습니다. 즉, 내가 같이 삭제 된 레코드의 ID는, 다시는 나타나지 않을 것이다.

HTH


이 점에서 나는 O'Rooney가 말하는 것을 전적으로 공유합니다.
Luca Nanetti 2019
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.