Skip to content

Instantly share code, notes, and snippets.

@eskil
Created March 18, 2012 20:32
Show Gist options
  • Save eskil/2081134 to your computer and use it in GitHub Desktop.
Save eskil/2081134 to your computer and use it in GitHub Desktop.
The ORM is inside me.
DROP TRIGGER Dive_Insert;
/*
if no dives predate this then
if lowest number is > 1:
lowest number - 1
else
1
else
pick most recent +1
*/
CREATE TRIGGER Dive_Insert AFTER INSERT ON Dive
BEGIN
UPDATE Dive
SET dive_number=
(SELECT CASE WHEN
/* If there are dives with datetime before this, ie. we're inserting
dives before any others ones in the log.
*/
(SELECT dive_number
FROM Dive
WHERE dive_datetime < NEW.dive_datetime
AND dive_id != NEW.dive_id
ORDER BY dive_datetime DESC LIMIT 1) IS NULL THEN
(SELECT CASE WHEN
/* Check if the lowest dive number is greater than 1.
"Greater than" to prevent inserting 0 or negative.
*/
(SELECT MIN(dive_number)
FROM Dive
WHERE dive_number > 0) > 1 THEN
/* if so, select that number minus 1 */
(SELECT MIN(dive_number)-1 FROM Dive WHERE dive_number > 1)
ELSE
/* Else start at 1 */
1
END)
ELSE
/* Common case, pick highest number sorted by datetime, plus 1 */
(SELECT MAX(dive_number)+1
FROM Dive
WHERE dive_datetime <= NEW.dive_datetime
AND dive_id != NEW.dive_id
AND dive_number > 0
ORDER BY dive_datetime DESC LIMIT 1)
END)
WHERE dive_id=NEW.dive_id;
END;
INSERT INTO Dive (dive_datetime, dive_duration, dive_maxdepth, dive_mintemp, dive_maxtemp, dive_notes, site_id, dive_visibility, dive_weight) VALUES ('2012-03-19 12:11:00', 60, 56.0, 8.7, 10.7, 'hello dive', 1, 10.0, 12.0);
SELECT dive_number FROM dive WHERE dive_datetime = '2012-03-19 12:11:00';
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment