Ik kan niets zeggen over de prestaties van de query, sorry. Maar misschien wilt u triggers overwegen om te voorkomen dat de 'new_balance' ooit negatief wordt. (Omdat het me vreemd lijkt om een null-insert te doen als de 'new_balance' lager is dan $bedrag, maar het zou toch kunnen werken :) ).
Zie documentatie van MySQL 5.0 voor details over het maken van een trigger.
In principe zou je de cheque, als NEW.new_balance negatief is, in een BEFORE-trigger zetten. Zo ja, dan zou u een "STOP ACTIE", een opzettelijke fout in uitvoering, gebruiken om de trigger en INSERT-query af te breken. Zie ideeën op de genoemde pagina in de opmerkingen.
Update:een beetje aan het sleutelen (mijn excuus om MySQL thuis te installeren).
Mijn versie heeft het probleem om een tweede keer naar de DB te schrijven voor elke waarde die in de moneylog is ingevoerd.
Misschien is het raadzaam om over te schakelen naar een opgeslagen proc. Of iemand anders heeft een beter idee, ik hou niet zo van DB :)
CREATE DATABASE triggertest;
CONNECT triggertest;
CREATE TABLE transferlog (
account SMALLINT UNSIGNED NOT NULL ,
amount INT NOT NULL,
new_balance INT NOT NULL
) ENGINE=INNODB;
CREATE TABLE stopaction (
entry CHAR(20) NOT NULL,
dummy SMALLINT,
UNIQUE(`entry`)
);
INSERT INTO stopaction (`entry`) VALUES ('stop');
DELIMITER #
CREATE TRIGGER nonneg_insert BEFORE INSERT ON transferlog
FOR EACH ROW BEGIN
INSERT INTO stopaction (`entry`)
SELECT CASE WHEN NEW.new_balance<0 THEN 'stop'
ELSE 'none' END;
DELETE FROM stopaction WHERE entry!='stop';
END;
#
CREATE TRIGGER nonneg_update BEFORE UPDATE ON transferlog
FOR EACH ROW BEGIN
INSERT INTO stopaction (`entry`)
SELECT CASE WHEN NEW.new_balance<0 THEN 'stop'
ELSE 'none' END;
DELETE FROM stopaction WHERE entry!='stop';
END;
#
DELIMITER ;
INSERT INTO transferlog (`account`, `amount`, `new_balance`)
VALUES (1, 1000, 1000);
INSERT INTO transferlog (`account`, `amount`, `new_balance`)
VALUES (1, -1000, 0);
INSERT INTO transferlog (`account`, `amount`, `new_balance`)
VALUES (1, -1000, -1000);
INSERT INTO transferlog (`account`, `amount`, `new_balance`)
VALUES (1, 10, 20);
SELECT version();
DROP DATABASE triggertest;
Misschien past het bij je, mijn output voor de INSERT-Lines is:
mysql> INSERT INTO transferlog (`account`, `amount`, `new_balance`) VALUES (1, 1000, 1000);
Query OK, 1 row affected (0.03 sec)
mysql> INSERT INTO transferlog (`account`, `amount`, `new_balance`) VALUES (1, -1000, 0);
Query OK, 1 row affected (0.02 sec)
mysql> INSERT INTO transferlog (`account`, `amount`, `new_balance`) VALUES (1, -1000, -1000);
ERROR 1062 (23000): Duplicate entry 'stop' for key 1
mysql> INSERT INTO transferlog (`account`, `amount`, `new_balance`) VALUES (1, 10, 20);
Query OK, 1 row affected (0.02 sec)
mysql> SELECT version();
+---------------------+
| version() |
+---------------------+
| 5.0.67-community-nt |
+---------------------+
1 row in set (0.00 sec)