Thanks for the suggestion on `UNIQUE`, I should have done it. Based on this
new schema I wrote (pseudoSQL code):

create table dummy (d text);  -- empty table to let us use
case...when...then syntax
create table variables(
    variable_id integer primary key autoincrement,
    name text not null,
    value integer not null
);

create trigger summary_insert
instead of insert on summary
begin
    select *,
        case when (select a_id from Alpha where a_attribute =
NEW.a_attribute) not null
        then
            (insert into variables (name, value) values ("AlphaPK", (select
a_id from Alpha where a_attribute = NEW.a_attribute)))
        else
            -- insert into Alpha
            -- get last_insert_rowid
            /*
                nested case...when...then till all pks are attained
                then insert into appropriate tables using something like
                    `select max(value) from variables where name = AlphaPK`
            */
    from dummy;
end;


But I guess this is too ugly, and difficult to maintain. I'll use DAL to do
all this work and insert in tables directly.

On Wed, Feb 20, 2019 at 5:53 PM Simon Slavin <slav...@bigfraud.org> wrote:

> On 20 Feb 2019, at 11:14am, Rocky Ji <rockyji3...@gmail.com> wrote:
>
> > create view summary
> > as
> >    select
> >        a.a_attribute,
> >        b.b_attribute,
> >        c.c_attribute
> >    from
> >        m2mAlphaBeta m
> >        inner join Alpha a on a.a_id = m.FK_a_id
> >        inner join Beta b on b.b_id = m.FK_b_id
> >        inner join Charlie c on c.FK_C_a_id = a.a_id;
> >
> > And assuming all incoming data (say from CSV read) is correct. How do I
> write a record to `summary`?
>
> First, congratulations on getting "integer primary key autoincrement"
> right for keys which are FOREIGN KEY keys.  Common mistake.  However, I
> suspect you've missed a bet.  Consider
>
> > create table Alpha (
> >    a_id integer primary key autoincrement,
> >    a_attribute text
> > );
>
> Would "a_attribute TEXT UNIQUE" be better ?  This would guard against two
> entries in Alpha having the same attribute, which I think you wouldn't
> don't want.  You can do the same thing for the other _attribute columns.
>
> In answer to the question, "summary" is a VIEW.  You don't have to write
> anything to it.  It looks like it already does what you want.
>
> > Like how do I get ROWID of the "just inserted" record in A to insert
> into C properly. I am thinking "should I make transactions, but we don't
> have variables"... and going round-and-round without solution.
>
> Ah, I see.  Okay, I'm going to ignore Charlie for clarity.  You have a CSV
> file containing two columns: a.a_attribute and b.b_attribute, and you're
> wondering how to get the data into Alpha, Beta and m2mAlphaBeta.  The
> answer is ... not in one command.  It can't be done.
>
> Reading two values from your CSV file, theAAttrib and theBAttrib,
>
> First, make sure that Alpha and Beta have the rows they need.
>
> INSERT OR IGNORE INTO Alpha (a_attribute) VALUES (theAAttrib);
> INSERT OR IGNORE INTO Beta (b_attribute) VALUES (theBAttrib);
>
> But you don't know whether those created new rows or not, so you have to
> find the rows you're going to want to use:
>
> newA_id = result of "SELECT a_id FROM Alpha WHERE a_attribute = '<
> theAAttrib>'"
> newB_id = result of "SELECT b_id FROM BETA WHERE b_attribute = <
> theBAttrib>"
>
> Then you have the values you need for "INSERT INTO Charlie".
>
> Unforunately, you cannot use last_insert_rowid() because you do not know
> whether your "INSERT OR IGNORE" inserted a new row or not.
>
> Fortunately, your "UNIQUE" constraints on the attribute columns means that
> you have indexes on them.  This means that the "SELECT" commands will
> execute very quickly.
>
> Extend the above for Charlie.
>
> Simon.
> _______________________________________________
> sqlite-users mailing list
> sqlite-users@mailinglists.sqlite.org
> http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
>
_______________________________________________
sqlite-users mailing list
sqlite-users@mailinglists.sqlite.org
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to