Thanks,
Chris
I have modified your scripts to work with MySQL ( see below ), I am
happy to put them on the wiki if they would be helpful to others.
Chris
load_merge.sql:
CREATE TEMPORARY TABLE links
(from_id INT NOT NULL
,to_id INT NOT NULL,
UNIQUE(from_id, to_id));
DELETE FROM links;
INSERT IGNORE INTO links (from_id, to_id)
SELECT
f.account_id
,t.account_id
FROM
accounts f
,accounts t
WHERE
f.preferred_email is not null
AND t.preferred_email is not null
AND f.account_id <> t.account_id
AND f.preferred_email = t.preferred_email
AND f.registered_on > t.registered_on;
INSERT IGNORE INTO links (from_id, to_id)
SELECT DISTINCT
f.account_id
,t.account_id
FROM
account_external_ids e_t
,account_external_ids e_f
,accounts f
,accounts t
WHERE
e_t.external_id = CONCAT('Google Account ', e_f.email_address)
AND e_f.account_id <> e_t.account_id
AND e_f.account_id = f.account_id
AND e_t.account_id = t.account_id
AND f.registered_on > t.registered_on;
SELECT
l.from_id
,l.to_id
,f.registered_on
,t.registered_on
,t.preferred_email
FROM
links l
,accounts f
,accounts t
WHERE
f.account_id = l.from_id
AND t.account_id = l.to_id
ORDER BY t.preferred_email;
merge_accounts.sql:
DROP TABLE to_del;
CREATE TEMPORARY TABLE to_del (old_id INT);
CREATE TEMPORARY TABLE tmp_ids
(email_address VARCHAR(255)
,account_id INT NOT NULL
,from_account_id INT NOT NULL
,external_id VARCHAR(255) NOT NULL
);
START TRANSACTION;
DELETE FROM tmp_ids;
INSERT INTO tmp_ids
(account_id
,from_account_id
,email_address
,external_id)
SELECT
l.to_id
,l.from_id
,e.email_address
,e.external_id
FROM links l, account_external_ids e
WHERE e.account_id = l.from_id
AND NOT EXISTS (SELECT 1 FROM account_external_ids q
WHERE q.account_id = l.to_id
AND q.external_id = e.external_id);
DELETE FROM account_external_ids
WHERE EXISTS (SELECT 1 FROM tmp_ids t
WHERE account_external_ids.external_id = t.external_id
AND account_external_ids.account_id = t.from_account_id);
INSERT INTO account_external_ids
(account_id
,email_address
,external_id)
SELECT
account_id
,email_address
,external_id
FROM tmp_ids;
INSERT INTO account_ssh_keys
(ssh_public_key
,valid
,account_id
,seq)
SELECT
k.ssh_public_key
,k.valid
,l.to_id
,100 + k.seq
FROM links l, account_ssh_keys k
WHERE k.account_id = l.from_id
AND NOT EXISTS (SELECT 1 FROM account_ssh_keys p
WHERE p.account_id = l.to_id
AND p.ssh_public_key = k.ssh_public_key);
INSERT INTO starred_changes
(account_id, change_id)
SELECT l.to_id, s.change_id
FROM links l, starred_changes s
WHERE l.from_id IS NOT NULL
AND l.to_id IS NOT NULL
AND s.account_id = l.from_id
AND NOT EXISTS (SELECT 1 FROM starred_changes e
WHERE e.account_id = l.to_id
AND e.change_id = s.change_id);
INSERT INTO account_project_watches
(account_id, project_name)
SELECT l.to_id, s.project_name
FROM links l, account_project_watches s
WHERE l.from_id IS NOT NULL
AND l.to_id IS NOT NULL
AND s.account_id = l.from_id
AND NOT EXISTS (SELECT 1 FROM account_project_watches e
WHERE e.account_id = l.to_id
AND e.project_name = s.project_name);
INSERT INTO account_group_members
(account_id, group_id)
SELECT l.to_id, s.group_id
FROM links l, account_group_members s
WHERE l.from_id IS NOT NULL
AND l.to_id IS NOT NULL
AND s.account_id = l.from_id
AND NOT EXISTS (SELECT 1 FROM account_group_members e
WHERE e.account_id = l.to_id
AND e.group_id = s.group_id);
UPDATE changes c
INNER JOIN links l
ON c.owner_account_id = l.from_id
SET c.owner_account_id = l.to_id
WHERE l.to_id IS NOT NULL;
UPDATE patch_sets p
INNER JOIN links l
ON p.uploader_account_id = l.from_id
SET p.uploader_account_id = l.to_id
WHERE l.to_id IS NOT NULL;
UPDATE patch_set_approvals p
INNER JOIN links l
ON p.account_id = l.from_id
LEFT OUTER JOIN patch_set_approvals existing_approval
ON existing_approval.change_id = p.change_id
AND existing_approval.patch_set_id = p.patch_set_id
AND existing_approval.account_id = l.to_id
AND existing_approval.category_id = p.category_id
SET p.account_id = l.to_id
WHERE l.to_id IS NOT NULL
AND existing_approval.account_id IS NULL;
UPDATE change_messages c
INNER JOIN links l
ON c.author_id = l.from_id
SET c.author_id = l.to_id
WHERE l.to_id IS NOT NULL;
UPDATE patch_comments p
INNER JOIN links l
ON p.author_id = l.from_id
SET p.author_id = l.to_id
WHERE l.to_id IS NOT NULL;
-- Destroy the from account
--
INSERT INTO to_del
SELECT from_id FROM links
WHERE to_id IS NOT NULL
AND from_id IS NOT NULL;
DELETE FROM account_agreements WHERE account_id IN (SELECT old_id FROM
to_del);
DELETE FROM account_external_ids WHERE account_id IN (SELECT old_id
FROM to_del);
DELETE FROM account_group_members WHERE account_id IN (SELECT old_id
FROM to_del);
DELETE FROM account_project_watches WHERE account_id IN (SELECT old_id
FROM to_del);
DELETE FROM account_ssh_keys WHERE account_id IN (SELECT old_id FROM
to_del);
DELETE FROM accounts WHERE account_id IN (SELECT old_id FROM to_del);
DELETE FROM starred_changes WHERE account_id IN (SELECT old_id FROM
to_del);
DELETE FROM patch_set_approvals WHERE account_id IN (SELECT old_id
FROM to_del);
On Nov 30, 10:11 am, Shawn Pearce <s...@google.com> wrote:
ERROR 1051 (42S02) at line 1: Unknown table 'to_del'
ERROR 1146 (42S02) at line 13: Table 'gerrit.links' doesn't exist