Mysql不同的表,复制,匹配字段,但列行是随机的

时间:2015-11-27 09:18:41

标签: mysql

我有两个不同的表table_usernames和jos_users,我需要匹配两个表列中的字段用户名和用户,然后如果列行匹配我需要table-usernames(注册日期)列复制到jos-users (注册)列行字段。到目前为止,我发现最接近的是

update
  table1 t1
  join table2 t2 on t2.field = t1.field
set
  t1.field1 = t2.matchingfield
where
  t1.whatever = t2.whatever

但是看起来它不会在我的情况下工作,只是想在我销毁我的数据库之前验证并发现我的备份已损坏...提前谢谢你

2 个答案:

答案 0 :(得分:2)

根据您的要求,您有两个表table_usernames和jos_users。

现在首先,我必须找到这两个表的映射,你已经从table_usernames和jos_users的用户定义了用户名。

现在,您要将table_usernames的ragistered日期设置为jos_users的注册字段。

UPDATE table_usernames t1,
           jos_users t2
    SET t2.registration = t1.registered_date // assign registered_date value to registration column of jos_users table 
    WHERE (t1.username = t2.users);   // Mapping (Common) Columns of both tables

这将从table_usernames表更新jos_users表的注册库。

答案 1 :(得分:0)

根据您的描述,声明将是

UPDATE table_usernames t1
INNER JOIN jos_users t2 ON t1.username = t2.users
SET t2.registration = t1.registered_date;

inner join已作为匹配用户名的过滤器。有关联接的直观说明,请访问此link

如果你想先检查,如果你的陈述是正确的,你可以先将它转换为选择,这样你就可以看到哪些记录会被更新

SELECT * FROM 
table_usernames t1
INNER JOIN jos_users t2 ON t1.username = t2.users;

或者,如果您使用的是支持InnoDB等所有表的事务的存储引擎,您可以这样做:

START TRANSACTION;
UPDATE table_usernames t1
INNER JOIN jos_users t2 ON t1.username = t2.users
SET t2.registration = t1.registered_date;

然后你可以检查SELECT whatever...(在同一个会话中!)如果一切顺利的话。您执行

时将写入数据
COMMIT;

如果你不想写它,你可以

ROLLBACK;

检查您的表是否使用InnoDB作为

的存储引擎
SHOW CREATE TABLE your_table_name\G

并在最后一行中看到

) ENGINE = InnoDB ...