Question

I realized that i was using a varchar attribute as a index/key in a query, and that is killing my query performance. I am trying to look in my precienct table and get the integer ID, and then update my record in the household table with the new int FK, placed in a new column. this is the sql i have written thus far. but i am getting a

Error 1093 You can't specify target table 'voterfile_household' for update in FROM clause, and i am not sure how to fix it.

UPDATE voterfile_household
SET
PrecID = (SELECT voterfile_precienct.ID
        FROM voterfile_precienct INNER JOIN voterfile_household
        WHERE voterfile_precienct.PREC_ID = voterfile_household.Precnum);
Was it helpful?

Solution

Try:

update voterfile_household h, voterfile_precienct p
   set h.PrecID = p.ID
 where p.PREC_ID = h.Precnum

Take a look at update reference here.

Similarly, you can use inner join syntax as well.

update voterfile_household h inner join voterfile_precienct p on (h.Precnum = p.PREC_id)
   set h.PrecID = p.ID

OTHER TIPS

What if the subquery returns more than one result? That's why it doesn't work.

On SQL Server you can get this type of thing to work if the subquery does "SELECT TOP 1 ...", not sure if mysql will also accept it if you add a "limit 1" to the subquery.

I also think this is pretty much a duplicate of this question ("Can I have an inner SELECT inside of an SQL UPDATE?") from earlier today.

Firstly, your index on a varchar isn't always a bad thing, if it is not a key you can shrink how much of the field you index to only index say the first 10 chars or so.

Secondly, it won't let you do this as if it is a set that is returned it could break.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top