【问题标题】:Sqlite INSERT OR REPLACE vs PRIMARY KEYSqlite 插入或替换与主键
【发布时间】:2021-06-01 17:40:25
【问题描述】:

使用 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)
);

【问题讨论】:

    标签: sqlite replace insert primary-key


    【解决方案1】:

    您似乎希望 VERSIONFNNEMAIL 列的组合是唯一的。
    为此,您需要在表的定义中使用 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');
    

    请参阅demo

    【讨论】:

    • 不是这样,不可能使用Unique。
    • @Leonardoxxx 为什么?
    猜你喜欢
    • 2013-08-11
    • 2015-05-11
    • 1970-01-01
    • 1970-01-01
    • 2011-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-21
    相关资源
    最近更新 更多