0

我的 SQL:

这不起作用:我希望此触发器起作用。

CREATE TRIGGER sync_VerseSearch AFTER INSERT ON `VerseTranslation`
BEGIN
UPDATE VerseSearch SET text = VerseSearch.text || ' \n ' || NEW.text WHERE VerseSearch.verse_id = NEW.verse_id;
END

这里VerseTranslation的模型verse_idVerseSearch表都有对应于每个 verse_id 的数据。

但是当我在 AFTER INSERT 触发器中使用 INSERT 语句时,它正在工作,并且 AFTER UPDATE 触发器中的 UPDATE 语句也可以工作:例如:

 CREATE TRIGGER sync_VerseSearch AFTER INSERT ON `VerseTranslation`
  BEGIN
  INSERT INTO VerseSearch (verse_id, text) VALUES(NEW.verse_id + 10000, NEW.text);
  END


 CREATE TRIGGER sync_VerseSearch AFTER UPDATE ON `VerseTranslation`
  BEGIN
  UPDATE VerseSearch SET text = VerseSearch.text || ' \n ' || NEW.text WHERE VerseSearch.verse_id = NEW.verse_id;
  END

在插入中添加了 +10000,因为 VerseSearch 表中已经存在具有每个对应 verse_id(6236) 的数据,因此它不会对主键 (verse_id) 进行唯一的约束错误。

问题是相反的 ACTION(INSERT 触发器中的 UPDATE 语句)不起作用;

模型结构:

VerseTranslation {
  @PrimaryKey(autogenerate=true)
  id: Int,
  verse_id: Int, // is not primary key // it is not unique, same verse_id multiple times.
  source_id: Int,
  text: String
}

VerseSearch {
  @PrimaryKey
  verse_id: Int, // here it is primary key // it's unique here
  text: String // here I want to Concat(via trigger) all values(and future insert values) in VerseTranslation.text where match verse_id
}

谢谢。

4

1 回答 1

0

触发器必须具有唯一的名称。

您还省略;了 INSERT 的末尾。

以下似乎包括您想要的:-

使用 :-

-- CLEAN EVRYTHING UP
DROP TRIGGER IF EXISTS sync_VerseSearch;
DROP TRIGGER IF EXISTS sync_VerseSearch_ai;
DROP TRIGGER IF EXISTS sync_VerseSearch_au;
    DROp TRIGGER IF EXISTS sync_VerrseSearch_aiu;
DROP TABLE IF EXISTS VerseSearch;
DROP TABLE IF EXISTS VerseTranslation;

-- CREATE ITEMS
CREATE TABLE IF NOT EXISTS VerseSearch (verse_id INTEGER PRIMARY KEY, text TEXT);
CREATE TABLE IF NOT EXISTS VerseTranslation (verse_id INTEGER PRIMARY KEY, text TEXT);

CREATE TRIGGER sync_VerseSearch_ai AFTER INSERT ON `VerseTranslation`
  BEGIN
  INSERT INTO VerseSearch (verse_id, text) VALUES(NEW.verse_id + 10000, NEW.text);
        UPDATE VerseSearch SET text = VerseSearch.text || ' \n ' || NEW.text WHERE VerseSearch.verse_id = NEW.verse_id;
  END
;
CREATE TRIGGER sync_VerseSearch_au AFTER UPDATE ON `VerseTranslation`
  BEGIN
  UPDATE VerseSearch SET text = VerseSearch.text || ' \n** ' || NEW.text WHERE VerseSearch.verse_id = NEW.verse_id;
  END
;

    /*
    CREATE TRIGGER sync_VerseSearch AFTER INSERT ON `VerseTranslation`
        BEGIN
        UPDATE VerseSearch SET text = VerseSearch.text || ' \n ' || NEW.text WHERE VerseSearch.verse_id = NEW.verse_id;
        END
    ;
    */

-- TESTING THE TRIGGERS
    INSERT INTO VerseSearch VALUES(null,'VSFred'),(null,'VSMary'),(null,'VSAnne'),(null,'VSJohn');
    SELECT * FROM VerseTranslation;
SELECT * FROM VerseSearch;

INSERT INTO VerseTranslation VALUES(null,'Fred'),(null,'Mary'),(null,'Anne'),(null,'John');
SELECT * FROM VerseTranslation;
SELECT * FROM VerseSearch;
UPDATE VerseTranslation SET text = text||'**TEST**' WHERE NOT instr(text,'**TEST**');
SELECT * FROM VerseTranslation;
SELECT * FROM VerseSearch;

结果

第一个选择:-

在此处输入图像描述

  • 暂时没有翻译

第二选择:-

在此处输入图像描述

  • 搜索未添加触发

翻译后的第三选择:-

在此处输入图像描述 - 添加了翻译,因此将触发对搜索的更改

由于触发,第 4 次搜索已更改并添加

![在此处输入图像描述

第 5 次翻译更新

在此处输入图像描述

添加了第 6 次超出范围的搜索

在此处输入图像描述

选择 :-

CREATE TRIGGER sync_VerseSearch_ai AFTER INSERT ON `VerseTranslation`
  BEGIN
  INSERT INTO VerseSearch (verse_id, text) VALUES(NEW.verse_id + 10000, NEW.text);
  UPDATE VerseSearch SET text = VerseSearch.text || ' \n ' || NEW.text WHERE VerseSearch.verse_id = NEW.verse_id;
  END
;
CREATE TRIGGER sync_VerseSearch_au AFTER UPDATE ON `VerseTranslation`
  BEGIN
  UPDATE VerseSearch SET text = VerseSearch.text || ' \n** ' || NEW.text WHERE VerseSearch.verse_id = NEW.verse_id + 10000;
  END
;
  • 这可能更合适,因为它们将被排序插入然后更新。
于 2019-07-12T20:42:07.870 回答