SQLite

介紹

SQLite 的特色在於整個資料庫就是一個檔案, 不用開額外的 daemon 處理, 任何要用的程式都自己開一個資料庫就可以使用。 SQLite 也常常被整合進程式語言中, 例如 Python 就直接在 standard library 裡有 SQLite 的支援。

Data Type

SQLite 的型別是 Dynamic、Weak。(Type Affinity)

SQLite 的欄位型別只是參考用(像是 Python 的 Type Hinting,沒有強制性), 就算事先說要存數值, 其實還是可以儲存字串或其他東西, 型別是在資料身上不是在欄位宣告上, 而且會在操作時嘗試幫你轉換。

CREATE TABLE dynamic_type(data int);

INSERT INTO dynamic_type (data) VALUES (1);
INSERT INTO dynamic_type (data) VALUES (2);
INSERT INTO dynamic_type (data) VALUES (3);
INSERT INTO dynamic_type (data) VALUES ("test");
INSERT INTO dynamic_type (data) VALUES ("wtf");
INSERT INTO dynamic_type (data) VALUES ("99");
INSERT INTO dynamic_type (data) VALUES ("99asd");

SELECT * FROM dynamic_type;           /* you can see everything here */
SELECT SUM(data) FROM dynamic_type;   /* 204 */

Trigger

SQLite 可以設定在更動資料時觸發特定操作。

CREATE TABLE our_command(id id, executed bool);

INSERT INTO our_command (id, executed) VALUES (42, 1);
INSERT INTO our_command (id, executed) VALUES (43, 0);
INSERT INTO our_command (id, executed) VALUES (44, 1);
INSERT INTO our_command (id, executed) VALUES (45, 0);

SELECT * FROM our_command;  /* you can see everything */

/* setup a trigger */
CREATE TRIGGER clear_executed_command UPDATE OF executed ON our_command
  BEGIN
    DELETE FROM our_command WHERE id = OLD.id;  /* OLD is a reference to current row */
  END;

/* update to trigger the command */
UPDATE our_command SET executed = 1 WHERE id = 42;

SELECT * FROM our_command;  /* you can see new result here */

/* remove the trigger */
DROP TRIGGER clear_executed_command;

Helper Functions

  • .tables

  • .schema