gsueagle2008
gsueagle2008

Reputation: 4663

Update Value in Table from another table

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);

Upvotes: 0

Views: 438

Answers (3)

lsl
lsl

Reputation: 4419

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.

Upvotes: 0

Pablo Santa Cruz
Pablo Santa Cruz

Reputation: 181280

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

Upvotes: 2

matt b
matt b

Reputation: 139921

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.

Upvotes: 0

Related Questions