我有兩張桌子,Accounts并且Person:
CREATE TABLE Person(
id INT NOT NULL PRIMARY KEY,
Person_Name VARCHAR(17) NOT NULL,
P_Location INT NOT NULL
);
INSERT INTO Person VALUES (1,"Adam",300),(2,"Betty",10),(3,"Louis",60);
CREATE TABLE Accounts(
Person_id INT PRIMARY KEY,
Balance INT DEFAULT 200);
INSERT INTO Accounts VALUES (1,2000),(2,1350),(3,800);
還有一個觸發器Bonuses:
CREATE TRIGGER Bonuses
AFTER UPDATE ON Person
FOR EACH ROW
UPDATE Accounts
SET Balance = CASE WHEN (SELECT P_Location FROM Person WHERE id = Person_id) = 3 THEN Balance - 150
WHEN (SELECT P_Location FROM Person WHERE id = Person_id) = 7 THEN Balance 100
WHEN (SELECT P_Location FROM Person WHERE id = Person_id) = 15 THEN Balance - 30
WHEN (SELECT P_Location FROM Person WHERE id = Person_id) = 1 THEN Balance 200
END;
我想讓觸發器Accounts根據某些指令更新表,只要表P_Location上的Person值更改為少數幾個值之一(3、7、15 和 1)。然而,事實上,他們的結果是不正確的。假設我運行上面的代碼,我得到的表是:
人
| ID | 選手姓名 | P_Location |
|---|---|---|
| 1 | 亞當 | 300 |
| 2 | 貝蒂 | 10 |
| 3 | 路易斯 | 60 |
賬戶
| Person_id | 平衡 |
|---|---|
| 1 | 2000 |
| 2 | 1350 |
| 3 | 800 |
現在,如果我運行,UPDATE Person SET P_Location = 3 WHERE id = 1;那么Accounts表應該產生:
| Person_id | 平衡 |
|---|---|
| 1 | 1850 |
| 2 | 1350 |
| 3 | 800 |
但是,我得到的是
| Person_id | 平衡 |
|---|---|
| 1 | 1850 |
| 2 | 無效的 |
| 3 | 無效的 |
知道我做錯了什么嗎?
uj5u.com熱心網友回復:
好吧,該代碼完全按照您所說的做了,盡管這不是您的意思!
這就是關于UPDATE查詢的事情,除非使用WHERE子句過濾實際修改的內容,否則每一行都會得到更新。從CASE大多數記錄中找不到任何內容,因此其中任何一個都將分配給NULL. 要查看此行為,請查看此
然后運行:UPDATE Person SET P_Location = 3 WHERE id = 1;
給出:

處理您的表的示例、簡化的觸發器案例處理以及更新查詢的輸出示例。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/533162.html
上一篇:我試圖在db中找到最喜歡的照片,有USERS、PHOTOS、LIKES、COMMENTS,但在likes表中沒有like_count列?
