I have two tables, Accounts
and 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);
And one trigger, 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;
And I want to make the trigger update the Accounts
table according to certain instructions whenever the P_Location
on the Person
table changes to one of a select few values (3,7,15 and 1). However, as things are they result is incorrect. Assume I run the above code, the tables I get are:
Person
id | Player_Name | P_Location |
---|---|---|
1 | Adam | 300 |
2 | Betty | 10 |
3 | Louis | 60 |
Accounts
Person_id | Balance |
---|---|
1 | 2000 |
2 | 1350 |
3 | 800 |
Now if I run UPDATE Person SET P_Location = 3 WHERE id = 1;
then the Accounts
table should yield:
Person_id | Balance |
---|---|
1 | 1850 |
2 | 1350 |
3 | 800 |
However, what I get is
Person_id | Balance |
---|---|
1 | 1850 |
2 | NULL |
3 | NULL |
Any idea of what I'm doing wrong?
CodePudding user response:
Well, that code did exactly what you said, though it wasn't what you meant!
That's the thing about UPDATE
queries, EVERY row will get an update unless a WHERE
clause is used to filter what actually gets modified. Nothing is found from the CASE
with most records, so any of those will get assigned to NULL
. To see this behavior, check this
Then run: UPDATE Person SET P_Location = 3 WHERE id = 1;
Example fiddle with your tables, the simplified trigger case handling, and the output examples from the update query.