We have a e-mail program that uses a table like:
CREATE TABLE Emails (
MessageID TEXT,
FromAddr TEXT,
ToAddr TEXT,
-- ...
);
The database takes up hundreds of megabytes of disk space. In order to
avoid the duplication of storing the same addresses thousands of times,
I'm planning to replace this with something like:
CREATE TABLE Addresses (
ID INTEGER PRIMARY KEY,
Address TEXT UNIQUE
);
CREATE TABLE Emails (
MessageID TEXT,
FromAddrRef INTEGER REFERENCES Addresses(ID),
ToAddrRef INTEGER REFERENCES Addresses(ID),
-- ...
);
-- Emulate the SELECT behavior of the old table.
CREATE VIEW EmailsView AS
SELECT
MessageID,
AF.Address AS FromAddr,
AT.Address AS ToAddr,
-- ...
FROM Emails
LEFT JOIN Addresses AF ON (FromAddrRef = AF.ID)
LEFT JOIN Addresses AT ON (ToAddrRef = AT.ID);
I'd like to be able to write INSERT statements on this view like on the
old version of the Emails table. Something like:
CREATE TRIGGER TriggerUpdateEmailsView
INSTEAD OF INSERT ON EmailsView
BEGIN
INSERT OR IGNORE INTO Addresses VALUES(NULL, FromAddr);
INSERT OR IGNORE INTO Addresses VALUES(NULL, ToAddr);
-- The statement below is invalid syntax.
INSERT INTO Emails (
MessageID,
(SELECT ID FROM Addresses WHERE Address=FromAddr),
(SELECT ID FROM Addresses WHERE Address=ToAddr)
)
END;
How do I do this?
_______________________________________________
sqlite-users mailing list
[email protected]
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users