【问题标题】:MySQL: Ignore error (#1054) and only SET existing columnsMySQL:忽略错误 (#1054) 并且只设置现有列
【发布时间】:2016-11-21 20:44:34
【问题描述】:

上下文:

我有一个程序将源数据库表垂直分成两个分区:

来源:

id | col1 | col2
1  | v1_1 | v1_2
2  | v2_1 | v2_2

分区 #1:

id | col1
1  | v1_1
2  | v2_1

分区 #2:

id | col2
1  | v1_2
2  | v2_2

对于客户/用户来说,他应该总是看起来只有一张桌子。当他选择所有数据时,应用程序会将分区合并到一张表中。

架构:

Client <--> Server <--> Databases (MySQL)

客户端向服务器发送参数。服务器在 DBMS 上创建并执行 MySQL 查询并返回结果(取决于操作/查询)。

更新操作的问题:

客户端向 HTTP Server 发送更新数据的请求:

HTTP1.1 | PUT
body: {
    db:'Partition_1',
    table: 'test_table',
    data: [
        {id:1, col1:'w1_1', col2:'w1_2'}
    ]
}

服务器创建以下语句:

UPDATE 'Partition_1'.'test_table' SET col1='w1_1' AND col2='w1_2';

这将导致错误#1054,因为第一个分区不知道列 'col2'! (而第二个分区不知道'col1')

我不想在请求中添加参数。 有没有办法忽略错误并只设置现有列?

(-> 这应该会更新第一个分区。将为第二个分区发送类似的请求。)

【问题讨论】:

  • 如果客户端知道要更新哪个分区,为什么不知道该分区中有哪些列?
  • AFAIK 无法让它忽略不存在的列。您可以使用INFORMATION_SCHEMA.COLUMNS 查找特定服务器上表中的列,并通过这种方式过滤掉未知列。
  • @Barmar 是的,客户端知道每个分区的列,但是我必须向客户端添加“分区逻辑”,我希望服务器能够做到这一点。带有INFORMATION_SCHEMA.COLUMNS 的服务器端选项也可以,但我不知道还有多少代码。你能具体说明你的第二条评论吗?也许有一些伪代码,所以我可以看到附加代码并选择一个选项(客户端或服务器端)?!顺便说一句:我在服务器上使用 JavaScript/NodeJS 和 Express。

标签: mysql mysql-error-1054


【解决方案1】:

您可以使用join 查询来更新两个列,例如:

update t1 join t2 on t1.id = t2.id
set t1.col1 = 10, t2.col2 = 10 where t1.id = 1;

这里是 SQL Fiddle

【讨论】:

  • 我认为问题在于创建查询的代码不知道哪些列在哪个表中。否则他可以删除不存在的列。
  • @Barmar 是对的。并且分区在不同的数据库上,可以在其他服务器上。所以我不能加入表格......但谢谢你们的快速回答。
【解决方案2】:

使用INFORMATION_SCHEMA.COLUMNS 将列过滤为该服务器上存在的列。以下查询将告诉您哪些列是有效的:

SELECT column_name
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_schema = 'Partition_1'
AND table_name = 'test_table'
AND column_name IN ('col1', 'col2');

然后,您可以使用此结果在 UPDATE 查询中构造分配。

顺便说一句,要分配给多个列,请用, 分隔它们,而不是AND

UPDATE test_table SET col1 = 'w1_1', col2 = 'w1_2' WHERE id = 1;

【讨论】:

    【解决方案3】:

    谢谢大家的帮助...

    我通过更改请求的参数来解决它。客户端现在只发送包含在表中的列的值。

    我没有更改服务器,因为他不应该知道数据库的数据模型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-01
      • 2012-03-09
      • 1970-01-01
      • 2016-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多