2016-11-21 12 views
0

Kontext:MySQL: Игнорировать ошибку (# 1054) и только SET существующих столбцов

У меня есть программка, которая расщепляет таблицу базы данных источника по вертикали на два раздела:

Источник:

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) 

Клиент посылает параметры сервера. Сервер создает и выполняет запрос MySQL в СУБД и возвращает результат (в зависимости от операции/запроса).

Проблема на операции обновления:

Клиент отправляет запрос на сервер HTTP с обновленным данным:

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»)

Я не хочу добавлять параметры в запрос. Есть ли способ игнорировать ошибку и просто установить существующие столбцы?

(-> Это должно обновить первый раздел Аналогичный запрос будет отправлен на второй раздел.).

+0

Если клиент знает, какой раздел необходимо обновить, почему он не знает, какие столбцы находятся в этом разделе? – Barmar

+1

AFAIK нет способа заставить его игнорировать столбцы, которые не существуют. Вы можете использовать 'INFORMATION_SCHEMA.COLUMNS', чтобы узнать столбцы в таблице на определенном сервере и отфильтровать неизвестные столбцы таким образом. – Barmar

+0

@Barmar Да, клиент знает столбцы каждого раздела, но затем мне нужно добавить логику раздела к клиенту, и я хотел, чтобы сервер сделал это. Вариант на стороне сервера с 'INFORMATION_SCHEMA.COLUMNS' тоже будет работать, но я не знаю, сколько еще кода он будет. Можете ли вы указать свой второй комментарий? Может быть, с некоторым псевдокодом, поэтому я могу увидеть дополнительный код и выбрать один вариант (на стороне клиента или на стороне сервера) ?! BTW: Я использую JavaScript/NodeJS и Express для сервера. – marcel

ответ

0

Вы можете использовать join запрос для обновления оба colums, например:

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

SQL Fiddle.

+1

Я думаю, проблема в том, что код, создающий запрос, не знает, какие столбцы находятся в этой таблице. В противном случае он мог бы просто удалить несуществующие столбцы. – Barmar

+0

@ Бармар прав. А разделы находятся в разных базах данных и могут находиться на других серверах. поэтому я не могу присоединиться к столам ..... но спасибо вам за ваши быстрые ответы. – marcel

0

Используйте 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 запросе.

BTW, чтобы назначить нескольким столбцам, вы разделите их ,, а не AND:

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

Спасибо, ребята за вашу помощь ...

Я решил это, изменив параметры запросов. Клиент теперь отправляет только значения столбцов, которые содержатся в таблице.

Я не изменил сервер, потому что он не должен знать базу данных баз данных.