Using SQLite Trigger to update “LastModified” field

后端 未结 1 726
面向向阳花
面向向阳花 2021-02-14 12:17

This might be more of a design question, but here goes. I\'m writing an Android app that uses a local SQLite database (with multiple tables) that syncs with a MySQL database eve

1条回答
  •  暗喜
    暗喜 (楼主)
    2021-02-14 12:48

    A short and sweet answer for you:

    1. After, so the trigger has a valid table to reference.
    2. You need to execute a CREATE TRIGGER for every table / column combination you want affected. The database won't assume because another table has a last_modified column that you want this one to behave the same...
    3. The trigger in your link is executable (I used it myself), just change the table / column names.

    Lastly, using a trigger like this is the easiest way I know to maintain last_modified or last_accessed timestamp.

    My trigger (in java form):

    private static final String UPDATE_TIME_TRIGGER =
        "CREATE TRIGGER update_time_trigger" + 
        "  AFTER UPDATE ON " + TABLE_NAME + " FOR EACH ROW" +
        "  BEGIN " +
            "UPDATE " + TABLE_NAME + 
            "  SET " + TIME + " = current_timestamp" +
            "  WHERE " + ID + " = old." + ID + ";" +
        "  END";
    

    Addition

    According to the SQLite website you need to create a trigger for each type of action. In other words, you cannot use:

    CREATE TRIGGER trigger_name 
      AFTER UPDATE, INSERT ...
    

    From your last comment you may have figured out the best way to handle an INSERT statement for our purpose:

    CREATE TABLE foo (
      _id INTEGER PRIMARY KEY,
      last_modified TIMESTAMP NOT NULL DEFAULT current_timstamp);
    

    In this table, you do not need to create a timestamp trigger for an INSERT statement, since it is done already. (Fun fact: INTEGER PRIMARY KEY implicitly adds AUTOINCREMENT NOT NULL as well as the default incremental value to our _id column.)

    0 讨论(0)
提交回复
热议问题