> But view_user statement makes no attempt to select the last version. It
picks some arbitrary random version. You might want to consider something
like this:

Why you wrote about "some arbitrary random version" when we have sorting by
"ts"?..

CREATE TABLE user
(
  id INTEGER PRIMARY KEY
);
CREATE TABLE user_record
(
  record_id INTEGER PRIMARY KEY,
  record_version INTEGER,
  ts INTEGER NOT NULL DEFAULT (strftime('%s','now')),
  user_id INTEGER NOT NULL,
  name TEXT,
  FOREIGN KEY(user_id) REFERENCES user
);

CREATE VIEW view_user AS
SELECT user.id,user_record.*
FROM user, user_record
WHERE user.id=user_record.user_id
GROUP BY user.id
ORDER BY ts ASC;

This view returns last by "ts" row for each unique "user_id". There is used
the SQLite hint with "group by" (non-grouped values returns too).

And conflict with equal "ts" can be resolved by trigger as:

CREATE TRIGGER view_user_update instead of update on view_user
begin
...
  SELECT RAISE(ABORT, 'User wait 1 second.')
    WHERE EXISTS(select 1 from user_record where user_id=OLD.user_id and
ts=strftime('%s','now'));
...
end;

-- 
Best regards, Alexey Pechnikov.
http://pechnikov.tel/
_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to