【问题标题】:Android Sqlite trigger operation go throughAndroid Sqlite 触发操作经过
【发布时间】:2011-08-26 00:34:46
【问题描述】:

这是我的第一个表,它有 3 列,全部由用户输入。没有并发症,它工作正常。但是还有另一个表,它依赖于这个表的第 3 列。即在房间号列上。请忽略命名约定,因为我没有真正遵循任何命名约定。

这是我的第二张桌子,您可以看到它的最后一列是房间号。请忽略名称约定。这个房间号列是外键它取决于第一个表条目或删除 现在我为第二个表创建了一个模式。它声明它有 5 列,最后一列是外键。

 private static final String DATABASE_CREATE_NOTES_ID_TABLE =
    ("CREATE TABLE "+ DATABASE_NOTES_TABLE +" ("+ KEY_ROWID +" INTEGER PRIMARY KEY AUTOINCREMENT, "+
            KEY_TIME + " TEXT, "+ 
            KEY_NOTES + " TEXT, "+ 
            KEY_DATE +  " TEXT, " +
            KEY_ROOMS + " INTEGER , FOREIGN KEY (" + KEY_ROOMS + ") REFERENCES " + DATABASE_PATIENT_TABLE +" (" +KEY_ROOM_NUMBER+ "));");

如您所见,表已成功创建。 现在我必须写一个TRIGGER语句,基于当我从第一个表中删除一个房间号时,第二个表中具有相同房间号的所有行都应该被删除。如果我在第一个表中添加一个新的房间号,那么它应该添加到第二个表中。 我写的插入新房号的触发语句如下

    db.execSQL("CREATE TRIGGER fk_notesTable_roomNumber " +
                " BEFORE INSERT "+
                " ON "+DATABASE_NOTES_TABLE+
                " FOR EACH ROW BEGIN"+
                " SELECT CASE WHEN ((SELECT "+KEY_ROOM_NUMBER+" FROM "+DATABASE_PATIENT_TABLE+" WHERE "+KEY_ROOM_NUMBER+"=new."+KEY_ROOMS +" ) IS NULL)"+
                " THEN RAISE (ABORT,'Foreign Key Violation') END;"+
                "  END;");

我在我的数据库文件的 onCreate() 中添加了这段代码。我还能做什么?这里什么都没有发生。 请指出我在哪里犯了错误。 非常感谢, 夏斯塔

【问题讨论】:

    标签: android database sqlite triggers


    【解决方案1】:

    您已添加INSERT 触发器。如果您尝试插入与触发器中指定的约束不匹配的行,则会引发错误;当另一个表中的行被删除时,它不会从一个表中删除行。

    您需要在第一个表上使用AFTER DELETE 触发器来删除相应的行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多