【问题标题】:Update Multiple Rows in SQLite Trigger更新 SQLite 触发器中的多行
【发布时间】:2014-08-20 11:54:58
【问题描述】:

是否可以在 SQLite 触发器中更新多行?请参阅下面的触发器。

CREATE TRIGGER "saved_tiles_reference"
 BEFORE DELETE ON favourites
FOR EACH ROW
BEGIN
    UPDATE saved_tiles SET reference_count = reference_count - 1 WHERE id = (select tile from favourite_tiles where favourite = OLD.id);
    DELETE FROM favourite_tiles WHERE id = OLD.id;
END;

如您所见,我想将 saved_tiles 的引用计数减少 1。我要更新的 saved_tiles 是使用 where 子句中的 select 语句定义的。

此触发器有效,但仅适用于它遇到的第一个条目。

编辑

saved_tiles 属于其父 favourites,它们通过表 favourite_tiles 连接。这是我的数据库结构

-- ----------------------------
--  Table structure for favourite_tiles
-- ----------------------------
DROP TABLE IF EXISTS "favourite_tiles";
CREATE TABLE "favourite_tiles" (
     "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
     "favourite" integer NOT NULL,
     "tile" integer NOT NULL
     CONSTRAINT "fk_favourite" FOREIGN KEY ("favourite") REFERENCES "favourites" ("id"),
     CONSTRAINT "fk_tiles" FOREIGN KEY ("tile") REFERENCES "saved_tiles" ("id")
);
INSERT INTO "main".sqlite_sequence (name, seq) VALUES ("favourite_tiles", '2');

-- ----------------------------
--  Table structure for favourites
-- ----------------------------
DROP TABLE IF EXISTS "favourites";
CREATE TABLE "favourites" (
     "id" integer NOT NULL,
    PRIMARY KEY("id")
);

-- ----------------------------
--  Table structure for saved_tiles
-- ----------------------------
DROP TABLE IF EXISTS "saved_tiles";
CREATE TABLE "saved_tiles" (
     "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
     "reference_count" integer NOT NULL DEFAULT 0
);
INSERT INTO "main".sqlite_sequence (name, seq) VALUES ("saved_tiles", '1');

-- ----------------------------
--  Triggers structure for table favourite_tiles
-- ----------------------------
CREATE TRIGGER "increment_tile_reference"
 BEFORE INSERT ON favourite_tiles
FOR EACH ROW
BEGIN
-- Type the SQL Here.
    UPDATE saved_tiles SET reference_count = reference_count + 1 WHERE id = NEW.tile;
END;

-- ----------------------------
--  Triggers structure for table favourites
-- ----------------------------
CREATE TRIGGER "saved_tiles_reference"
 BEFORE DELETE ON favourites
FOR EACH ROW
BEGIN
-- Type the SQL Here.
    UPDATE saved_tiles SET reference_count = reference_count - 1 WHERE id = (select tile from favourite_tiles where favourite = OLD.id);
    DELETE FROM favourite_tiles WHERE id = OLD.id;
END;

【问题讨论】:

  • 表之间有什么关系?
  • 将数据库结构添加到问题中
  • 这不能回答我的问题。哪些列是外键?
  • 抱歉,由于某种原因没有使用外键。现在将它们添加到编辑中。 saved_tiles 绑定到 favourite_tiles 表中的 favourites

标签: sqlite triggers


【解决方案1】:

不幸的是,我解决了它。

我没有使用id = (select....,而是在修改后的触发器中使用id IN (select ...,如下所示。

CREATE TRIGGER "saved_tiles_reference"
 BEFORE DELETE ON favourites
FOR EACH ROW
BEGIN
    UPDATE saved_tiles SET reference_count = reference_count - 1 WHERE id IN (select tile from favourite_tiles where favourite = OLD.id);
    DELETE FROM favourite_tiles WHERE favourite = OLD.id;
END;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-03
    相关资源
    最近更新 更多