0

我有points字段表

id(primary key), lat, lon

还有cctv_cams

  cctv_id(primary key), point_id, name

最后是speeding_cams

speeding_id(primary key), point_id_a, point_id_b, name

每个,cctv_camsspeeding_cams有自己的一套点。他们没有相同的观点。一行cctv_cams可以引用多points行。cctv_cams如果没有对应的 .row 就不能存在points

我尝试设置外键,所以当我删除时cctv_cams,所有对应points的也会被删除。看起来我必须在所有表中定义外键才能做到这一点?

更新:重新设计表的说明

点本身不是一行,而是points表中的一系列行。对于一个逻辑点,我插入了许多点,所有这些点都应该被标识为 1 个点。有 3 个来源应该参考这样的一系列观点。

  1. cctv_cams桌子
  2. speeding_camsA点
  3. speeding_camsB点

回到级联 - 例如,当我删除超速凸轮记录时,所有系列的点 A 和 B 也应该从points表中删除。cctv cam 记录也是如此。

4

1 回答 1

0

通常,您需要定义具有外键的表,因此:

CREATE TABLE cctv_cams (
cctv_id INTEGER PRIMARY KEY,
point_id INTEGER,
name TEXT,
FOREIGN KEY (point_id) REFERENCES points(id) ON DELETE CASCADE ON UPDATE CASCADE);

这将导致删除points导致元素cctv_cams被删除。相反,对于删除cctv_cams导致相应points条目被删除的删除,您应该定义一个触发器:

CREATE TRIGGER points_cctv_cams_Trigger AFTER DELETE ON cctv_cams
BEGIN
  DELETE FROM points WHERE id = old.point_id);
END;

至于一行cctv_cams有多个条目points,您的定义并没有表明这一点。一排就是一排。也许您需要修改您的架构?


有关外键的更多信息:

要检查是否启用了外键支持,请使用:

PRAGMA foreign_keys;

要确保它已启用,请使用:

PRAGMA foreign_keys = ON;

每次连接时都需要进行设置。不必每次都这样做的唯一方法是,如果 SQLite 没有使用SQLITE_OMIT_FOREIGN_KEYor编译SQLITE_OMIT_TRIGGER。因为这可能会根据您从哪里获得副本而改变,请检查您的foreign_keys价值。如果您的版本让您开启,它总是会开启。请记住:它不依赖于数据库,而是依赖于引擎。

于 2012-12-11T19:23:01.110 回答