[英]How can you implement an If statement in a SQLite trigger?
我們在SQLite數據庫中定義了一種自引用關系,如下所示...
Create Table Categories{
Id INTEGER PRIMARY KEY,
Name TEXT NOT NULL CHECK(length(Text) > 0),
ParentId INTEGER References Categories(Id),
IsSelected BOOL
};
我們正在嘗試在IsSelected字段上設置觸發器,以自動將值傳播到層次結構中。
將值設置為True時,這很容易。 我們只需將觸發器設置為將其父級設置為True,這又對其父級執行相同的操作,沿層次結構向上移動直到到達根。
但是,當我們將其設置為False時,該邏輯將不適用,因為可能會更改記錄的另一個同級,而該同級仍然為true,因此其父級仍然為true。
那么,如何在觸發器中執行以下操作? 請注意,這顯然是SQL,C#和LINQ的荒謬混合,但這說明了我正在嘗試做的事情。
CREATE TRIGGER T_Categories_IsSelectedChanged
UPDATE OF IsSelected ON Categories
BEGIN
if(new.IsSelected)
Update Categories Set IsSelected = True Where Id = old.ParentId;
else
{
void isSiblingSelected = Categories
.Where(c => c.ParentId = old.ParentId)
.Any(c => c.IsSelected);
UPDATE Categories
SET IsSelected = isSiblingSelected
WHERE Id = old.ParentId;
}
END
現在從技術上講,“ Else”子句在兩種情況下均適用。 If可能是短路,但也許我可以做這樣的事情...
Update Categories
SET IsSelected = (
SELECT EXISTS(SELECT 1 FROM Categories
WHERE IsSelected = True
AND ParentId = old.ParentId
LIMIT 1))
Where ID = old.ParentId;
...但這只是一個猜測。 我在正確的軌道上嗎?
您可以參考http://www.sqlite.org/lang_expr.html#case 。
我不確定,但您的代碼可能像這樣,
CREATE TRIGGER T_Categories_IsSelectedChanged
UPDATE OF IsSelected ON Categories
BEGIN
case when new.isSelected then
Update Categories Set IsSelected = True Where Id = old.ParentId;
else
Update Categories Set IsSelected = Categories
.Where(c => c.ParentId = old.ParentId)
.Any(c => c.IsSelected);
END
CASE不是聲明; 您只能在表達式內使用它。
但是,觸發器具有WHEN子句 ,該子句采用任意SQL表達式:
CREATE TRIGGER T_Categories_IsSelectedChanged_true
AFTER UPDATE OF IsSelected ON Categories
FOR EACH ROW
WHEN new.IsSelected
BEGIN
UPDATE Categories
SET IsSelected = 1
WHERE Id = old.ParentId;
END;
CREATE TRIGGER T_Categories_IsSelectedChanged_false
AFTER UPDATE OF IsSelected ON Categories
FOR EACH ROW
WHEN NOT new.IsSelected
BEGIN
UPDATE Categories
SET IsSelected = (SELECT IFNULL(MAX(IsSelected), 0)
FROM Categories
WHERE ParentId = old.ParentId)
WHERE Id = old.ParentId;
END;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.