mysql - 如何将一个表中的一列值插入到另一个不匹配的模式中?

标签 mysql inner-join insert-into

我有两个表:
表 A:lastNamefirstNameclientExtension
表 B:约 45 列,但是 lastNamefirstNameclientExtension 也在该表中。这三列的数据类型在每个表中匹配。lastName VARCHAR(150),firstName VARCHAR(150),clientExtension INT(5) unsigned.

表 A 有 31 行,没有 NULL 值。 表A中的记录已经存在于表B中,但我的目标是更新表B中的clientExtension值> 成为每个代理的 Table A 中的 clientExtension 值。

这是我到目前为止尝试过的方法,没有运气..

INSERT INTO table_A (lastName, firstName, clientExtension)
SELECT clientExtension
FROM tableB AS tb
WHERE lastName=tb.lastName
AND firstName=tb.firstName;

我也尝试过使用 UPDATE 函数,但我似乎无法让它工作。感觉我正在尝试做的是 INNER JOIN,除了我不希望使用 INNER JOIN 的输出创建一个新表,我'我希望使用 Table A 中的 clientExtension 值更新 Table B 中的现有记录。

有什么想法吗??

最佳答案

在这些表中有几十行之前,此架构需要一些帮助。如果那确实是您的架构,那么当名称更改时您会遇到一些问题。展示更好的方法需要几分钟时间,请耐心等待。

如果您还没有(在更好的架构上),我将展示更新/加入模式。

create table tableA
(   -- assuming this is really a user table
    id int auto_increment primary key, -- if you don't have this, you are going to have problems
    firstName varchar(150) not null,
    lastName varchar(150) not null,
    clientExtension int not null -- sign, display width of no concern
);-- sign, display width of no concern
insert tableA (firstName,lastName,clientExtension) values ('f1','l1',777),('f2','l2',888);

create table tableB
(   -- assuming this is really a user table
    id int auto_increment primary key, -- if you don't have this, you are going to have problems
    firstName varchar(150) not null,
    lastName varchar(150) not null,
    clientExtension int not null
);
insert tableB (firstName,lastName,clientExtension) values ('f1','l1',0),('f2','l2',0);

update tableB b
join tableA a
on a.id=b.id
set b.clientExtension=a.clientExtension;

select * from tableA;
(same as below)

select * from tableB;
+----+-----------+----------+-----------------+
| id | firstName | lastName | clientExtension |
+----+-----------+----------+-----------------+
|  1 | f1        | l1       |             777 |
|  2 | f2        | l2       |             888 |
+----+-----------+----------+-----------------+

总而言之,如果您联接在一个表中更改的名称而不是另一个表中的名称,则会遇到问题。这就是为什么您需要一个不会改变的主键(而不是当 Bob 再次成为 Robert 时)。

此外,如果您的表不是用户表,那么 int id 的 PK 也同样重要。 id 在其他表中使用,没有将 firstName、lastName 拖到那些 non-user Entity 表中作为键的非规范化想法,如果你愿意的话。

非用户实体 表是什么意思?好吧,这是我编造的,第一个出现在我脑海中的短语。它是关于数据规范化,以及第二和第三范式等概念。假设您有一张工资单表。一行需要由 PayeeId(即上表中的用户 ID)和其他信息(例如支付期等)来标识。通过名字和姓氏来标识收款人的一种可怕方式。

B 计划:(我对这样做嗤之以鼻,但就是这样)

update tableB b
join tableA a
on a.firstName=b.firstName and a.lastName=b.lastName
set b.clientExtension=a.clientExtension;
-- 2 row(s) affected

关于mysql - 如何将一个表中的一列值插入到另一个不匹配的模式中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32232770/

相关文章:

php - 在 mysql 中使用 strpos?

mysql - 在 INNER JOIN SQL 查询上使用 ORDER BY

mysql - 如何从 Rails 上的多个表进行 SQL 查询?

SQL插入和更新

mysql - mysql 中基于反向 REGEX 的 SELECT

php - 查找 PHP 代码中的编码错误和不良编码实践

mysql - Laravel - 违反完整性约束 : 1452 Cannot add or update a child row

Mysql加入表间共享数据

sql - 对同一表的列强制执行外键约束

insert-into - 插入多个选择并给出 ERROR 1242 : Subquery returns more than 1 row