SQLite 결과(JSON 및 기타)
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
이거 흥미롭게 생겼네...
그럼에도 불구하고 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);
Reference
이 문제에 관하여(SQLite 결과(JSON 및 기타)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/patarapolw/sqlite-findings-on-json-and-others-13op텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)