정리

'SQLite'에 해당되는 글 3건

  1. SQLite - Syntax
  2. SQLite - insert or replace (upsert)
  3. SQLite - Transaction과 Database Lock

SQLite - Syntax

저장소/VC++




SQLite is followed by unique set of rules and guidelines called Syntax. This tutorial gives you a quick start with SQLite by listing all the basic SQLite Syntax.

Case Sensitivity

Important point to be noted is that SQLite is case insensitive, but there are some commands, which are case sensitive like GLOB and glob have different meaning in SQLite statements.

Comments

SQLite comments are extra notes, which you can add in your SQLite code to increase its readability and they can appear anywhere; whitespace can occur, including inside expressions and in the middle of other SQL statements but they can not be nested.

SQL comments begin with two consecutive "-" characters (ASCII 0x2d) and extend up to and including the next newline character (ASCII 0x0a) or until the end of input, whichever comes first.

You can also use C-style comments, which begin with "/*" and extend up to and including the next "*/" character pair or until the end of input, whichever comes first. C-style comments can span multiple lines.

sqlite>.help -- This is a single line comment

SQLite Statements

All the SQLite statements start with any of the keywords like SELECT, INSERT, UPDATE, DELETE, ALTER, DROP, etc., and all the statements end with a semicolon (;).

SQLite ANALYZE Statement:

ANALYZE;
or
ANALYZE database_name;
or
ANALYZE database_name.table_name;

SQLite AND/OR Clause:

SELECT column1, column2....columnN
FROM   table_name
WHERE  CONDITION-1 {AND|OR} CONDITION-2;

SQLite ALTER TABLE Statement:

ALTER TABLE table_name ADD COLUMN column_def...;

SQLite ALTER TABLE Statement (Rename):

ALTER TABLE table_name RENAME TO new_table_name;

SQLite ATTACH DATABASE Statement:

ATTACH DATABASE 'DatabaseName' As 'Alias-Name';

SQLite BEGIN TRANSACTION Statement:

BEGIN;
or
BEGIN EXCLUSIVE TRANSACTION;

SQLite BETWEEN Clause:

SELECT column1, column2....columnN
FROM   table_name
WHERE  column_name BETWEEN val-1 AND val-2;

SQLite COMMIT Statement:

COMMIT;

SQLite CREATE INDEX Statement :

CREATE INDEX index_name
ON table_name ( column_name COLLATE NOCASE );

SQLite CREATE UNIQUE INDEX Statement :

CREATE UNIQUE INDEX index_name
ON table_name ( column1, column2,...columnN);

SQLite CREATE TABLE Statement:

CREATE TABLE table_name(
   column1 datatype,
   column2 datatype,
   column3 datatype,
   .....
   columnN datatype,
   PRIMARY KEY( one or more columns )
);

SQLite CREATE TRIGGER Statement :

CREATE TRIGGER database_name.trigger_name 
BEFORE INSERT ON table_name FOR EACH ROW
BEGIN 
   stmt1; 
   stmt2;
   ....
END;

SQLite CREATE VIEW Statement :

CREATE VIEW database_name.view_name  AS
SELECT statement....;

SQLite CREATE VIRTUAL TABLE Statement:

CREATE VIRTUAL TABLE database_name.table_name USING weblog( access.log );
or
CREATE VIRTUAL TABLE database_name.table_name USING fts3( );

SQLite COMMIT TRANSACTION Statement:

COMMIT;

SQLite COUNT Clause:

SELECT COUNT(column_name)
FROM   table_name
WHERE  CONDITION;

SQLite DELETE Statement:

DELETE FROM table_name
WHERE  {CONDITION};

SQLite DETACH DATABASE Statement:

DETACH DATABASE 'Alias-Name';

SQLite DISTINCT Clause:

SELECT DISTINCT column1, column2....columnN
FROM   table_name;

SQLite DROP INDEX Statement :

DROP INDEX database_name.index_name;

SQLite DROP TABLE Statement:

DROP TABLE database_name.table_name;

SQLite DROP VIEW Statement :

DROP INDEX database_name.view_name;

SQLite DROP TRIGGER Statement :

DROP INDEX database_name.trigger_name;

SQLite EXISTS Clause:

SELECT column1, column2....columnN
FROM   table_name
WHERE  column_name EXISTS (SELECT * FROM   table_name );

SQLite EXPLAIN Statement :

EXPLAIN INSERT statement...;
or 
EXPLAIN QUERY PLAN SELECT statement...;

SQLite GLOB Clause:

SELECT column1, column2....columnN
FROM   table_name
WHERE  column_name GLOB { PATTERN };

SQLite GROUP BY Clause:

SELECT SUM(column_name)
FROM   table_name
WHERE  CONDITION
GROUP BY column_name;

SQLite HAVING Clause:

SELECT SUM(column_name)
FROM   table_name
WHERE  CONDITION
GROUP BY column_name
HAVING (arithematic function condition);

SQLite INSERT INTO Statement:

INSERT INTO table_name( column1, column2....columnN)
VALUES ( value1, value2....valueN);

SQLite IN Clause:

SELECT column1, column2....columnN
FROM   table_name
WHERE  column_name IN (val-1, val-2,...val-N);

SQLite Like Clause:

SELECT column1, column2....columnN
FROM   table_name
WHERE  column_name LIKE { PATTERN };

SQLite NOT IN Clause:

SELECT column1, column2....columnN
FROM   table_name
WHERE  column_name NOT IN (val-1, val-2,...val-N);

SQLite ORDER BY Clause:

SELECT column1, column2....columnN
FROM   table_name
WHERE  CONDITION
ORDER BY column_name {ASC|DESC};

SQLite PRAGMA Statement:

PRAGMA pragma_name;

For example:

PRAGMA page_size;
PRAGMA cache_size = 1024;
PRAGMA table_info(table_name);

SQLite RELEASE SAVEPOINT Statement:

RELEASE savepoint_name;

SQLite REINDEX Statement:

REINDEX collation_name;
REINDEX database_name.index_name;
REINDEX database_name.table_name;

SQLite ROLLBACK Statement:

ROLLBACK;
or
ROLLBACK TO SAVEPOINT savepoint_name;

SQLite SAVEPOINT Statement:

SAVEPOINT savepoint_name;

SQLite SELECT Statement:

SELECT column1, column2....columnN
FROM   table_name;

SQLite UPDATE Statement:

UPDATE table_name
SET column1 = value1, column2 = value2....columnN=valueN
[ WHERE  CONDITION ];

SQLite VACUUM Statement:

VACUUM;

SQLite WHERE Clause:

SELECT column1, column2....columnN
FROM   table_name
WHERE  CONDITION;


SQLite - insert or replace (upsert)

저장소/VC++

데이터가 있으면 update 하고 없으면 insert 하는 방법을 찾다가 정리한다.

'insert or replace' 에 대한 내용은 아래 링크 참고.



INSERT OR REPLCAE example


SQLite Query Language: INSERT

SQLite Query Language: REPLACE

SQLite Query Language: ON CONFLICT clause


REPLACE


When a UNIQUE constraint violation occurs, the REPLACE algorithm deletes pre-existing rows that are causing the constraint violation prior to inserting or updating the current row and the command continues executing normally. If a NOT NULL constraint violation occurs, the REPLACE conflict resolution replaces the NULL value with the default value for that column, or if the column has no default value, then the ABORT algorithm is used. If a CHECK constraint violation occurs, the REPLACE conflict resolution algorithm always works like ABORT.


When the REPLACE conflict resolution strategy deletes rows in order to satisfy a constraint, delete triggers fire if and only if recursive triggers are enabled.


The update hook is not invoked for rows that are deleted by the REPLACE conflict resolution strategy. Nor does REPLACE increment the change counter. The exceptional behaviors defined in this paragraph might change in a future release.


SQLite - Transaction과 Database Lock

저장소/VC++

Transaction과 Lock 상태의 이해가 반드시 필요하다.


(보기 불편해서 쬐끔 수정...)



Lock type

unlocked, shared, reserved, pending, exclusive (unlocked 를 제외하고 모두 제각각 Lock 있음)


unlocked : database에 연결, begin transaction으로 Tr 시작 상태

shared : DB에서 read 하려고 하는 모든 세션이 획득해야 함 - 다중 세션에서 read 가능하고, shared 락은 활성화 되어 있지만 어떤 세션도 wrtie는 안됨

reserved : wrtie 하고자 하는 세션은 reserved 획득해야 함. 다른 read 세션은 방해하지 않으며, 새로 접근 하는 read 세션도 허용한다. 적용하는 변경 내역은 메모리에 캐시 된다.

exclusive : reserved 락을 획득한 세션에서 변경 내역(or Tr)을 commit 하려면 획득해야 함

pending : reserved 가 exclusive 를 획득하기 위해서는 pending 을 먼저 획득해야 함 - pending lock을 획득하면 새로운 shared lock 제한하고, shard lock들이 모두 끝나길 기다린다. 기다림이 끝나면 pending -> exclusive로 전환되면서 모든 사항 반영한다.


요약 : READ : unlocked -> shared

         WRITE : unlocked -> shared -> reserved -> pending -> exclusive

 


Transaction Type (deferred, immediate, exclusive)

begin [ deferred | immediate | exclusive ] transaction;


deferred : Tr type을 명시하지 않았을 경우 default 값이며, 어떤 락도 생성하지 않고, unlocked로 시작함.

DB의 첫번째 읽기 연산에서 shared lock 획득 시도.

DB의 첫번째 쓰기 연산에서 reserved lock 획득 시도.

immediate : begin 명령이 실행 되자마자 reserved 락 획득 시도.

성공 시, 어떤 다른 세션도 DB에 쓸 수 없게 begin immediate 명령이 보장함.

기존에 shared lock 획득 세션은 읽기 계속 할 수 있으나, 새로운 세션에서는 읽지 못하게 reserved lock이 막음.

다른 어떠한 세션도 begin immediate 나 begin exclusive 명령을 성공적으로 실행할 수 없음.

      ERROR CODE : SQLITE_BUSY

이렇게 시작된 Tr은 데이터 변경은 가능하나 commit은 불가. commit 수행 시

      ERROR CODE : SQLITE_BUSY

shared lock을 획득한 다른 세션에서 DB 읽고 있기 때문. 해당 세션들 shared lock 모두 해제 후 Tr commit 가능하다.

exclusive : Tr은 해당 DB의 exclusive lock 획득.

immediate 와 유사하나, 이 lock을 획득하면 어떤 다른 세션도 그 DB를 사용할 수 없어서 읽기/쓰기를 마음대로 할 수 있다.

 

DB에 쓰기에 있어서 concurrent 를 고려해야 하는 상황 이라면 일단은 transaction type을 deferred 가 아닌 것으로 주어 동기화 이슈를 회피 가능하다.




추가 참고 :



'저장소 > VC++' 카테고리의 다른 글

System Performance Monitoring  (0) 2013.08.06
printf Type Field Characters & Size Specification  (0) 2013.07.29
MIDL Language Reference  (0) 2013.07.12
P2P  (0) 2013.06.12
Visual Studio 2012 Debugging - Parallel Stack  (0) 2013.05.21