多终端数据同步的应用场景下,如果当前终端数据不存在,则需要执行插入操作;如果已经存在,则视情况执行更新或忽略操作。SQLite 的 INSERT OR REPLACE INTO
和 INSERT OR IGNORE INTO
可以满足以上的需求。语法说明如下:
操作 | 说明 | 备注 |
---|---|---|
INSERT OR REPLACE INTO | 如存在,则更新,否则插入 | 只对 PRIMARY KEY 或 UNIQUE 约束字段起作用 |
INSERT OR IGNORE INTO | 如存在,则忽略,否则插入 | 只对 PRIMARY KEY 或 UNIQUE 约束字段起作用 |
1 | $ CREATE TABLE ACCOUNT (ID BIGINT, NAME text, PASS text, DATE datetime, PRIMARY KEY(ID, NAME)); |
1 | $ CREATE TABLE ACCOUNT (ID BIGINT, NAME text, PASS text, DATE datetime, UNIQUE(ID, NAME)); |
执行以上两段 SQL 语句中的任意一段,创建表并插入对应的数据,唯一不同的地方在于对 ID、NAME 约束的关键字不同,但都可以起到同样效果。约束了两个字段表示在执行插入更新、插入忽略时,只有 ID 和 NAME 字段的值都相同的情况下才会执行更新、忽略操作,否则执行插入操作。建表,插入数据后的视图如下:
插入更新(插入):执行以下 SQL 语句,由于 ID 和 NAME 字段中的 NAME 字段值(10,’Adin’)-(10,’Flor’)不同。所以,即使 ID 值一样,依然会执行插入操作。
1 | INSERT OR REPLACE INTO ACCOUNT VALUES (10,'Flor','123456','2005-01-01 01:01:01'); |
插入更新(更新):执行以下 SQL 语句,由于 ID 和 NAME 字段中的值(10,’Flor’)-(10,’Flor’)都相同。所以,该语句会更新其他字段的数据,该条语句执行完毕后,会发现 Flor 对应的密码已经更新。
1 | INSERT OR REPLACE INTO ACCOUNT VALUES (10,'Flor','888888','2005-01-01 01:01:01'); |
插入忽略(插入):执行以下 SQL 语句,由于 ID 和 NAME 字段中的 NAME 字段值(10,’Jean’)与其他条目的 NAME 字段值不同。所以,即使 ID 值一样,依然会执行插入操作。
1 | INSERT OR IGNORE INTO ACCOUNT VALUES (10,'Jean','123456','2005-01-01 01:01:01'); |
插入忽略(忽略):执行以下 SQL 语句,由于 ID 和 NAME 字段中的值(10,’Jean’)-(10,’Jean’)都相同。所以,不管其他字段值相同与否,都会执行忽略操作。执行以下操作后,我们会看到主控台提示有零条数据被影响。
1 | INSERT OR IGNORE INTO ACCOUNT VALUES (10,'Jean','999999','2005-01-01 01:01:01'); |