首页 > 解决方案 > Sqlite 插入或替换与主键

问题描述

使用 sqlite

我需要插入整条记录。如果它已经存在,则应忽略该记录。

如果我使用下面的命令,通知“id_key”号码,它会按预期工作:

INSERT OR REPLACE INTO contatos ('id_key', 'VERSION', 'FN', 'N', 'EMAIL') 
VALUES (209, '2.1', 'bla bla', 'bla;bla;;;', 'bla@x.com');

但是如何在不通知自动递增的“id_key”字段的值的情况下重现此行为。如果我使用这样的代码,如果数据已经存在,它会重复数据:

INSERT OR REPLACE INTO contatos ('id_key', 'VERSION', 'FN', 'N', 'EMAIL') 
VALUES (NULL, '2.1', 'bla bla', 'bla;bla;;;', 'bla@x.com');

我的桌子:

CREATE TABLE "contatos" (
    "id_key"    INTEGER NOT NULL,
    "VERSION"   TEXT,
    "FN"    TEXT,
    "N" TEXT,
    "EMAIL" TEXT,
    "TEL;WORK"  TEXT,
    "TEL;HOME"  TEXT,
    "TEL;CELL"  TEXT,
    "PHOTO;ENCODING=BASE64;JPEG"    TEXT,
    "EMAIL;HOME"    TEXT,
    "ADR;HOME"  TEXT,
    "TEL;VOICE" TEXT,
    "TEL;PREF"  TEXT,
    "TEL;X-Celular" TEXT,
    "EMAIL;PREF"    TEXT,
    "TEL;X-Antigo"  TEXT,
    "ORG"   TEXT,
    "TEL;X-WhatsApp"    TEXT,
    PRIMARY KEY("id_key" AUTOINCREMENT)
);

标签: sqlitereplaceinsertprimary-key

解决方案


您似乎希望列VERSIONFNN的组合EMAIL是唯一的。
为此,您需要UNIQUE在表的定义中添加一个约束:

CREATE TABLE "contatos" (
    "id_key"    INTEGER NOT NULL,
    "VERSION"   TEXT,
    "FN"    TEXT,
    "N" TEXT,
    "EMAIL" TEXT,
    "TEL;WORK"  TEXT,
    "TEL;HOME"  TEXT,
    "TEL;CELL"  TEXT,
    "PHOTO;ENCODING=BASE64;JPEG"    TEXT,
    "EMAIL;HOME"    TEXT,
    "ADR;HOME"  TEXT,
    "TEL;VOICE" TEXT,
    "TEL;PREF"  TEXT,
    "TEL;X-Celular" TEXT,
    "EMAIL;PREF"    TEXT,
    "TEL;X-Antigo"  TEXT,
    "ORG"   TEXT,
    "TEL;X-WhatsApp"    TEXT,
    PRIMARY KEY("id_key" AUTOINCREMENT),
    UNIQUE(VERSION, FN, N, EMAIL)
);

然后用于INSERT OR IGNORE插入新行,而不使用id_key

INSERT OR IGNORE INTO contatos (VERSION, FN, N, EMAIL) 
VALUES ('2.1', 'bla bla', 'bla;bla;;;', 'bla@x.com');

或者INSERT OR REPLACE,如果您希望删除具有相同 4 列组合的现有行并插入新行:

INSERT OR REPLACE INTO contatos (VERSION, FN, N, EMAIL) 
VALUES ('2.1', 'bla bla', 'bla;bla;;;', 'bla@x.com');

请参阅演示


推荐阅读