MySQL вставляет/обновляет строку, содержащую тип точки, используя подготовленный оператор

Я использую подготовленный оператор, чтобы попытаться вставить новую строку в таблицу MySQL, и, если индекс существует, выполнить обновление. Я совершенно уверен, что проблема связана с полем «точка» с надписью «grp_hall_geoPoint». Я получаю сообщение об ошибке:

"SQLException in updateGroup: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SET grp_country='Australia', grp_state='New South Wales', grp_region='Sydney Nor' at line 1"

Передаваемые значения:

public static void updateGroup(String state,
            String region, String district, String group, String section,
            String subSection, String archiveDate, String latitude, String longditude, String nas) {[/code]

Подготовленное заявление:

String insertUpdateQry = ("INSERT INTO at_group " +
                    "(grp_country, grp_state, grp_region, grp_district, grp_name, " +
                        " grp_section, grp_sub_section, grp_archived, grp_hall_geoPoint, grp_nas) " +
                    "VALUES (?, ?, ?, ?, ?, ?, ?, ?, PointFromText(CONCAT('POINT(', ?, ' ', ?, ')')), ?)" +
                    "ON DUPLICATE KEY " +
                    "UPDATE at_group " +
                      "SET grp_country=?, grp_state=?, grp_region=?, grp_district=?, " +
                      "grp_name=?, grp_section=?, grp_sub_section=?, grp_archived=?, " +
                      "grp_hall_geoPoint=PointFromText(CONCAT('POINT(', ?, ' ', ?, ')')), grp_nas=?;");

            try {
                // Get Connection and Statement from DataSource
                c = ds.getConnection();
                ps = c.prepareStatement(insertUpdateQry);

                try {
                    // Create a statement and execute the query on it
                    ps.setString(1, "Australia");
                    ps.setString(2, state);
                    ps.setString(3, region);
                    ps.setString(4, district);
                    ps.setString(5, group);
                    ps.setString(6, section);
                    ps.setString(7, subSection);
                    ps.setString(8, archiveDate);
                    ps.setString(9, latitude);
                    ps.setString(10, longditude);
                    ps.setString(11, nas);

                    ps.setString(12, "Australia");
                    ps.setString(13, state);
                    ps.setString(14, region);
                    ps.setString(15, district);
                    ps.setString(16, group);
                    ps.setString(17, section);
                    ps.setString(18, subSection);
                    ps.setString(19, archiveDate);
                    ps.setString(20, latitude);
                    ps.setString(21, longditude);
                    ps.setString(22, nas);

                    ps.executeUpdate();

В уникальный индекс входят следующие элементы: grp_country, grp_state, grp_region, grp_district, grp_name, grp_section, grp_sub_section.

grp_hall_geoPoint — тип точки

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


person Glyn    schedule 02.10.2018    source источник


Ответы (2)


Вы можете изменить этот запрос на (удалить имя таблицы и оператор set):

Ссылка здесь: http://www.mysqltutorial.org/mysql-insert-or-update-on-duplicate-key-update/

String insertUpdateQry = ("INSERT INTO at_group " +
                    "(grp_country, grp_state, grp_region, grp_district, grp_group, " +
                        " grp_section, grp_sub_section, grp_archived, grp_hall_geoPoint, grp_nas) " +
                    "VALUES (?, ?, ?, ?, ?, ?, ?, ?, PointFromText(CONCAT('POINT(', ?, ' ', ?, ')')), ?)" +
                    "ON DUPLICATE KEY " +
                    "UPDATE " +
                      "grp_country=?, grp_state=?, grp_region=?, grp_district=?, " +
                      "grp_name=?, grp_section=?, grp_sub_section=?, grp_archived=?, " +
                      "grp_hall_geoPoint=PointFromText(CONCAT('POINT(', ?, ' ', ?, ')')), grp_nas=?;");
person Gauravsa    schedule 02.10.2018

Синтаксическая ошибка не имеет ничего общего с типом данных точки. Вы не должны указывать имя таблицы и set после update в предложении on duplicate key update.

Итак, вместо

...
"ON DUPLICATE KEY " +
"UPDATE at_group " +
"SET grp_country=?, ...

Вам нужно просто написать:

...
"ON DUPLICATE KEY " +
"UPDATE grp_country=?, ...
person Shadow    schedule 02.10.2018