SQLite 결과(JSON 및 기타)

23245 단어 nosqlsqldatabasesqlite

JSON



직관적이지는 않지만 MongoDB만큼 강력할 수 있습니다. 인덱싱이 어떻게 작동하는지 잘 모르겠지만 ... (하지만 작동합니다)

sqlite> CREATE TABLE user (phone);
sqlite> INSERT INTO user VALUES ('{}');
sqlite> CREATE UNIQUE INDEX idx_user_phone_x_y ON user(json_extract(phone, '$.x.y'));
sqlite> UPDATE user SET phone = json_set(phone, '$.x.y', 'b');
sqlite> INSERT INTO user VALUES ('{"a":"b","x":{"y":"b"}}');
Error: UNIQUE constraint failed: index 'idx_user_phone_x_y'
sqlite> UPDATE user SET phone = json_set(phone, '$.x', json('{"z":"c"}'));


열 유형을 JSON으로 선언할 수도 있지만 잘못된 JSON은 확인하지 않습니다. (체크 제약 조건을 두지 않는 한.)

sqlite> CREATE TABLE user (name JSON);
sqlite> INSERT INTO user VALUES ('{');
sqlite> CREATE TABLE user (name CHECK(json_valid(name)));
sqlite> INSERT INTO user VALUES ('{');
Error: CHECK constraint failed: user
sqlite> INSERT INTO user VALUES ('a');
Error: CHECK constraint failed: user
sqlite> INSERT INTO user VALUES ('1');
sqlite> INSERT INTO user VALUES (1);
sqlite> INSERT INTO user VALUES ('{}');


SQLITE_MAX_VARIABLE_NUMBER



이전 버전에서는 기본적으로 999였지만 지금은 증가했습니다.

Python, Node.js 및 Android의 경우 저에게 큰 제한 요소였습니다. SQLite 드라이버를 직접 컴파일하는 방법을 모릅니다.

Golang의 go-sqlite에서는 다음과 같이 쉽습니다.

export CGO_CFLAGS='-DSQLITE_MAX_VARIABLE_NAME=1000000'


유형 검사 vs 유형 강제



CONSTRAINT를 생성하지 않으면 발생하지 않습니다. 친화력이 있다는 것은 알지만 그것이 무엇을 의미하는지 잘 모르겠습니다. (특히 "NUMERIC"의 경우)

sqlite> CREATE TABLE user (name INT);
sqlite> INSERT INTO user VALUES ('a');
sqlite> INSERT INTO user VALUES (1);
sqlite> PRAGMA integrity_check;
ok
sqlite> CREATE TABLE user1 (name CHECK(TYPEOF(name) = 'integer'));
sqlite> INSERT INTO user1 VALUES ('a');
Error: CHECK contraint failed: user1


흥미롭게도 SQLite에는 유형 강제 변환이 있습니다(최소한으로 유지되어야 한다고 생각합니다).

sqlite> CREATE TABLE user (name INT);
sqlite> INSERT INTO user VALUES ('1');
sqlite> INSERT INTO user VALUES (1);
sqlite> SELECT COUNT(*) FROM user WHERE name = 1;
2
sqlite> CREATE TABLE user (name);
sqlite> INSERT INTO user VALUES ('1');
sqlite> INSERT INTO user VALUES (1);
sqlite> SELECT COUNT(*) FROM user WHERE name = 1;
1


COLLATION과 비슷하지 않을까요?

sqlite> CREATE TABLE user (name COLLATE NOCASE);
sqlite> INSERT INTO user VALUES ('a');
sqlite> INSERT INTO user VALUES ('A');
sqlite> SELECT COUNT(*) FROM user WHERE name = 'a';
2


타임스탬프



트리거를 통해서도 updatedAt 열을 만들 수 있지만 먼저 type을 TIMESTAMP로 지정하면 어떻게 되는지 알려드리겠습니다.

sqlite> CREATE TABLE user (name TIMESTAMP);
sqlite> INSERT INTO user VALUES (strftime('%s','now'));
sqlite> SELECT * FROM user WHERE name = 1610445191;
1610445191
sqlite> SELECT * FROM user WHERE name = '1610445191';
1610445191
sqlite> SELECT * FROM user WHERE name LIKE '161%';
1610445191


내가 사용하는 방아쇠에 대해

CREATE TABLE user (name, updatedAt TIMESTAMP DEFAULT (strftime('%s','now')));
CREATE TRIGGER t_user_updatedAt BEFORE UPDATE ON user
FOR EACH ROW
WHEN NEW.updatedAt = OLD.updatedAt
BEGIN
  UPDATE user SET updatedAt = strftime('%s', 'now') WHERE ROWID = NEW.ROWID;
END;


기본 키



auto 는 INTEGER PRIMARY KEY ( don't need autoincrement 이고 INT 는 작동하지 않으며 INTEGER 여야 합니다.

sqlite> CREATE TABLE user (id INT PRIMARY KEY, name);
sqlite> INSERT INTO user VALUES (1, 1);
sqlite> INSERT INTO user VALUES (1, 1);
Error: UNIQUE constraint failed: user.id
sqlite> INSERT INTO user VALUES (null, 1);
sqlite> INSERT INTO user VALUES (null, 1);


나는 PRIMARY KEY가 반복적으로 NULL이 될 수 있다는 것을 결코 알지 못했습니다 ...

물론,

sqlite> CREATE TABLE user (id INTEGER PRIMARY KEY, name);
sqlite> INSERT INTO user VALUES (null, 1);
sqlite> INSERT INTO user VALUES (1, 1);
Error: UNIQUE constraint failed: user.id


BTW, 명시적 PRIMARY KEY가 필요하지 않습니다. ROWID는 이미 자동 생성되었습니다. (없으면 INTEGER PRIMARY KEY ROW ).

sqlite> CREATE TABLE user (id INT PRIMARY KEY, name);
sqlite> INSERT INTO user VALUES (null, 1);
sqlite> INSERT INTO user VALUES (1, 1);
sqlite> .header 1
sqlite> SELECT *, oid FROM user;
id|name|rowid
|1|1
1|1|2
sqlite> SELECT *, oid oid FROM user;
id|name|oid
|1|1
1|1|2


이거 흥미롭게 생겼네...
  • https://stackoverflow.com/questions/3906811/null-permitted-in-primary-key-why-and-in-which-dbms
  • https://www.sqlite.org/lang_createtable.html#primkeyconst

  • 그럼에도 불구하고 PRIMARY KEY는 자동으로 고유합니다(그러나 NULL 허용).

    sqlite> CREATE TABLE user (id TEXT PRIMARY KEY, name);
    sqlite> INSERT INTO user VALUES ('a', 1);
    sqlite> INSERT INTO user VALUES ('a', 1);
    Error: UNIQUE constraint failed: user.id
    sqlite> INSERT INTO user VALUES (null, 1);
    sqlite> INSERT INTO user VALUES (null, 1);
    

    좋은 웹페이지 즐겨찾기