I've been having this problem as well, which results from mySQL not allowing
you to select and insert from the same table at the same time. This
restriction makes some sense even in your case- mySQL wants to insert each
row as it finds it in the select, but then that might change what results
the select returns. The restriction is less relevant if you are performing a
select which can return at most one row, but mySQL still enforces it.
There are a couple of solutions to this. The cleanest one is probably just
to use temporary tables to implement a true sub-select. (I've put together a
framework to do this hidden behind an abstraction layer so that I can do
subselects whether I'm using mySQL or a different database with a more
robust SQL implementation.)
That would go something like:

create temporary table TMP_table select table1.* from table1 left join
table2 on id where table2.id is null;
insert into table2 select * from TMP_table;
drop table TMP_table;

A much uglier solution involves creating a new permanent table which
duplicates the field you are selecting from table2, adding a field to
table2, and generating a unique number somehow.
You'd set this up with:

create table table2_id select id from table2;
alter table table2 add column insertion_id int;

(you'd probably also want to index table2_id...)
and then for each query run:

insert into table2 select table1.*, theUniqueNumber from table1.* left join
table2_id on id where table2_id.id is null;
insert into table2_id select id from table2 where
insertion_id=theUniqueNumber;

(and then, if you like, you can null out the insertion_id fields)

Obviously, this approach is best avoided because it is invasive, it pollutes
your database with wasteful and confusing processing information, and it
relies on your ability to come up with a unique ID.
The main advantage here is that these statements are pure insertions, so you
can execute them with the DELAYED flag, which can be very important in
reducing UI latency. (Again, a good wrapper library which allows you to
submit any SQL commands asyncronously from another thread is also useful in
this respect.) Of course, if that is important then you'd probably want to
do something substantially more clever than the standard auto_increment
database ops to pick your unique number. It also avoids the use of temporary
tables, which some claim are not as efficient as simple selects across
additional permanent tables. (I haven't done the profiling to test this
theory, however.)

On 27/2/02 at 9:18 am, Sommai Fongnamthip <[EMAIL PROTECTED]> wrote:

> 
> Hi,
>          MySQL has insert into function and sub select (mysql style) but I 
> could not conclude these function togethter.
> 
>          If I want to select not existing row in 2 table, I used:
> 
>          SELECT table1.* FROM table1 LEFT JOIN table2 ON 
> table1.id=table2.id where table2.id is null
> 
> then I'd like to insert the result row back into table2 by this SQL:
> 
>          insert into table2 SELECT table1.* FROM table1 LEFT JOIN table2
ON 
> table1.id=table2.id where table2.id is null
> 
>          it got this error:
>          ERROR 1066: Not unique table/alias: 'table2'
> 
>          How could I fixed this problem??
> 
> Sommai


---------------------------------------------------------------------
Before posting, please check:
   http://www.mysql.com/manual.php   (the manual)
   http://lists.mysql.com/           (the list archive)

To request this thread, e-mail <[EMAIL PROTECTED]>
To unsubscribe, e-mail <[EMAIL PROTECTED]>
Trouble unsubscribing? Try: http://lists.mysql.com/php/unsubscribe.php

Reply via email to