Question

I have consolidated a joined table with it's related entity as the relationship was one-to-one.

So now the original ww_staff table holds the ww_contacts details directly.

I wrote the following statement based on what I think is logical from MySQL's perspective
but - its not happy.

Can anyone see a similar solution or a blatent transgression?

INSERT INTO 
  ww_staff s 
  (phone, mobile, email, skype) 
VALUES 
(
  SELECT w.phone, w.mobile, w.email, w.skype 
  FROM ww_contacts w
  JOIN ww_staff s
  ON s.staff_ID = w.contacts_ID
);
Was it helpful?

Solution

You need to do an INSERT ... SELECT ... ON DUPLICATE KEY UPDATE statement. This will insert new rows and update existing ones:

INSERT INTO 
  ww_staff
  (staff_ID, phone, mobile, email, skype) 
SELECT w.contacts_ID, w.phone, w.mobile, w.email, w.skype 
  FROM ww_contacts w
  JOIN ww_staff s
  ON s.staff_ID = w.contacts_ID
ON DUPLICATE KEY UPDATE
 ww_staff.phone = w.phone, ww_staff.mobile = w.mobile, ww_staff.email = w.email, ww_staff.skype = w.skype

OTHER TIPS

Just remove the VALUES()

INSERT INTO ww_staff s (phone, mobile, email, skype) 
SELECT w.phone, w.mobile, w.email, w.skype FROM ww_contacts w
JOIN ww_staff s
ON s.staff_ID = w.contacts_ID;

--UPDATE

Since you are selecting from ww_contacts w JOIN ww_staff - all the records are there already - and you do not want to insert duplicates, use a update with a join:

UPDATE ww_staff s JOIN ww_contacts w ON s.staff_ID = w.contacts_ID
SET s.phone = w.phone, s.mobile = w.mobile, s.email = w.email, s.skype = w.skype;

Next time please explain more in your question what you are trying to do.

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