繁体   English   中英

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

[英]Mysql different tables, copy over, match field, but column rows are random

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

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

但这似乎无法在我遇到的情况下起作用,只是想在销毁数据库并发现备份损坏之前进行验证...预先谢谢

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

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

现在,您想将table_usernames的最糟糕的日期设置为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表的注册行。

根据您的描述,声明将是

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

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

如果要先检查,如果语句正确,则可以先将其转换为选择语句,这样就可以看到哪些记录将被更新。

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...检查SELECT whatever... (在同一会话中!),如果一切顺利。 数据将在您执行时写入

COMMIT;

如果您不希望它被编写,您可以

ROLLBACK;

检查您的表是否使用InnoDB作为存储引擎

SHOW CREATE TABLE your_table_name\G

并在最后一行看到

) ENGINE = InnoDB ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM