如何将一列值从一个 table 插入到另一个不匹配的模式?

How do I insert a column of values from one table to another, non-matching schemas?

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

中匹配

Table A 有 31 行,没有 NULL 值。 TableA中的记录已经在TableB中了,但是我的objective是更新clientExtension Table B 中的值是 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,我正在寻找更新Table B 中的现有记录以及 Table A.
中的 clientExtension

有什么想法吗??

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

然后我会展示 update/join 模式,如果你还没有它(在更好的架构上)。

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 |
+----+-----------+----------+-----------------+

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

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

non-user Entity table 是什么意思?好吧,这是我编造的,第一个出现在我脑海中的短语。它是关于数据规范化,以及第二和第三范式等概念。假设您有一个工资单 table。一行需要由 PayeeId(即您在 tables 上面的用户 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