【问题标题】:Sqlite3 - foreign key mismatch on BLOBSqlite3 - BLOB 上的外键不匹配
【发布时间】:2015-09-30 12:08:36
【问题描述】:

我正在使用外键,不幸的是在下面的情况下我无法解决不匹配问题......我错过了什么?表格由以下人员创建:

CREATE TABLE IF NOT EXISTS `devices` (
    `guid`  BLOB NOT NULL,
    `device_name`   TEXT NOT NULL,
    `class` INTEGER NOT NULL
);

CREATE TABLE IF NOT EXISTS `device_states` (
    `guid_d`    BLOB NOT NULL,
    `id_d`  TEXT DEFAULT NULL,
    `tp`    INTEGER NOT NULL,
    `state` INTEGER NOT NULL,
    `note`  TEXT DEFAULT NULL,
    `status`    INTEGER NOT NULL DEFAULT 0,
    PRIMARY KEY(`guid_d`,`tp`),
    FOREIGN KEY(`guid_d`) REFERENCES devices ( `guid` ) ON DELETE RESTRICT
);
CREATE INDEX IF NOT EXISTS idx_ds_tp ON device_states(`tp`);

INSERT OR IGNORE INTO `devices` VALUES (x'438D6E77DC3946A4819617ADBA18ADB2','guid_door', 1);

选择波纹管按预期工作:

SELECT * FROM `devices` WHERE guid = x'438D6E77DC3946A4819617ADBA18ADB2';

1 行返回自:SELECT * FROM devices WHERE guid = x'438D6E77DC3946A4819617ADBA18ADB2'; (耗时 1 毫秒)

但是,当我尝试将数据插入 devices 表时,我得到了错误...

INSERT INTO device_states (guid_d, id_d, tp, state, note, status) 
VALUES (x'438D6E77DC3946A4819617ADBA18ADB2', "D", 132456, 1, "door open", 2);

外键不匹配 - 引用“设备”的“设备状态”:插入 INTO device_states (guid_d, id_d, tp, state, note, status) 值 (x'438D6E77DC3946A4819617ADBA18ADB2', "D", 132456, 1, "门打开", 2);

有人看到这个问题吗???非常感谢!

【问题讨论】:

    标签: sqlite foreign-keys


    【解决方案1】:

    documentation 说:

    通常,外键约束的父键是父表的主键。如果它们不是主键,则父键列必须共同受制于 UNIQUE 约束或具有 UNIQUE 索引。

    guid 没有这样的限制。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-29
      • 2012-11-12
      • 2021-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-28
      相关资源
      最近更新 更多