我几乎从不使用 MYSQL,但在一个小项目中不得不使用它。
我有两个相同的表,都存储不同的数据。 我希望能够将数据添加到表 A,然后如果表 B 中存在与列值匹配的数据,则复制表 A 中可能存在的任何值,然后从表 B 中删除该条目。
示例 表B
姓名 | 年龄 | 高度 | 重量 |
---|---|---|---|
鲍勃 | 2 | 10 | 10 |
蒂姆 | 空 | 20 | 20 |
表A
姓名 | 年龄 | 高度 | 重量 |
---|---|---|---|
插入表A TIM、4、10、空
表A
姓名 | 年龄 | 高度 | 重量 |
---|---|---|---|
蒂姆 | 4 | 10 | 空 |
然后应该检查表 B 中是否有与我们刚刚使用的名称匹配的任何条目,并使用任何丢失/错误的数据更新表 A,以便表 A 最终看起来像这样。
表A
姓名 | 年龄 | 高度 | 重量 |
---|---|---|---|
蒂姆 | 4 | 20 | 20 |
最后从表 B 中删除该条目
表B
姓名 | 年龄 | 高度 | 重量 |
---|---|---|---|
鲍勃 | 2 | 10 | 10 |
最后表 A 应该具有完整更新的记录,表 B 应该具有尚未与表 A 中的某些内容关联的任何内容
我将其编写为存储过程,所以我尝试做这样的事情:
`INSERT INTO tableA (NAME, AGE, HEIGHT, WEIGHT) VALUES ( NAME_IN, AGE_IN, HEIGHT_IN, WEIGHT_IN);
SELECT * INTO @Aentry FROM tableA WHERE NAME = NAME_IN;
IF EXISTS ( SELECT * INTO @Bentry FROM tableB WHERE NAME = @Aentry.NAME)
THEN
UPDATE tableA SET
NAME =IFNULL(@Bentry.NAME, NAME),
AGE =IFNULL(@Bentry.AGE, AGE),
HEIGHT =IFNULL(@Bentry.HEIGHT, HEIGHT),
WEIGHT=IFNULL(@Bentry.WEIGHT, WEIGHT)
WHERE NAME = @Bentry.NAME;
DELETE FROM tableB WHERE NAME = @Aentry.NAME;
END IF;`
但是由于 SELECT * 这似乎不起作用。
-- S a m p l e D a t a :
/* WITH TABLE_B
NAME AGE HEIGHT WEIGHT
------ ---- ------ -------
BOB 2 10 10
TIM null 20 20 */
/* WITH TABLE_A
NAME AGE HEIGHT WEIGHT
------ ---- ------ -------
TIM 4 10 null */
UPDATE TABLE_A a
INNER JOIN TABLE_B b ON(b.NAME = a.NAME)
SET a.AGE = Case When Coalesce(a.AGE, 0) != b.AGE Then b.AGE Else a.AGE End,
a.HEIGHT = Case When Coalesce(a.HEIGHT, 0) != b.HEIGHT Then b.HEIGHT Else a.HEIGHT End,
a.WEIGHT = Case When Coalesce(a.WEIGHT, 0) != b.WEIGHT Then b.WEIGHT Else a.WEIGHT End;
/* TABLE_A - after update
NAME AGE HEIGHT WEIGHT
------ ---- ------ -------
TIM 4 20 20 */
DELETE FROM TABLE_B b
WHERE EXISTS (Select 1 From TABLE_A a
Where a.NAME = b.NAME And
a.AGE Is Not Null And
a.HEIGHT Is Not Null And
a.WEIGHT Is Not Null);
/* TABLE_B - after delete
NAME AGE HEIGHT WEIGHT
------ ---- ------ -------
BOB 2 10 10 */