简体   繁体   中英

SQLite UPDATE statement is not working inside AFTER INSERT Trigger (Android, Room)

My SQL:

this is not working: I want this trigger to work.

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

Here VerseTranslation model has verse_id and also VerseSearch table has data corresponding to each verse_id.

But when I'm using INSERT statement in the AFTER INSERT trigger it's working and UPDATE statement in the AFTER UPDATE trigger also working too: example:

 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

added +10000 in insert because there is already data in VerseSearch table with each corresponding verse_id(6236) so it does not unique Constraint error for primary key(verse_id).

Problem is opposite ACTION(UPDATE statement in INSERT trigger) not working;

Model Structure:

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
}

Thanks.

Trigger's have to have unique names.

You have also omitted ; at the end of the INSERT.

The following appears to include be what you want:-

Using :-

-- 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;

Results

1st Select :-

在此处输入图片说明

  • No translations as yet

2nd Select :-

在此处输入图片说明

  • searches added no triggering

3rd Select after translations :-

在此处输入图片说明 - tranalations added so will trigger changes to search

4th searches changed and added due to triggering

![在此处输入图片描述

5th translations updated

在此处输入图片说明

6th out of range searches added

在此处输入图片说明

Alternative :-

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
;
  • this may be more suitable as they will be sequenced INSERT then UPDATE.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM