如何将一列值从一个 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 列,但是 lastName
、firstName
、clientExtension
也在这个 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
我有两个table:
Table A: lastName
,firstName
,clientExtension
Table B:~45 列,但是 lastName
、firstName
、clientExtension
也在这个 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