Синхронизация базы данных MySQL с внешним источником (.csv) при сохранении предыдущих данных

Спецификация SQL92 указывает, что идентификаторы могут быть указаны или не кавычки. Если обе стороны не сортируются, то они всегда чувствительны к регистру, например. table_name == TAble_nAmE.

Однако цитируемые идентификаторы чувствительны к регистру, например. "table_name" != "TAble_naME". Также, основываясь на спецификации, если вы хотите сравнить неотображаемые идентификаторы с цитируемыми, то идентификаторы без кавычек и кавычек могут считаться одинаковыми, если неуказанные символы в верхнем регистре, например. TABLE_NAME == "TABLE_NAME", но TABLE_NAME != "table_name" или TABLE_NAME != "TAble_NaMe".

Вот соответствующая часть спецификации (раздел 5.2.13):

     13)A  and a  are equiva-
        lent if the  of the  (with
        every letter that is a lower-case letter replaced by the equiva-
        lent upper-case letter or letters) and the  of the  (with all occurrences of
         replaced by  and all occurrences of  replaced by ), considered as
        the repetition of a  that specifies a
         of SQL_TEXT and an implementation-
        defined collation that is sensitive to case, compare equally
        according to the comparison rules in Subclause 8.2, "".

Обратите внимание, что как и в других частях стандарта SQL, не все базы данных следуют этому полностью. PostgreSQL, например, хранит все некотируемые идентификаторы с нижним регистром вместо верхнего, поэтому table_name == "table_name" (что точно соответствует стандарту). Кроме того, некоторые базы данных нечувствительны к регистру все время, или чувствительность к регистру зависит от некоторых параметров в БД или зависит от некоторых свойств системы, как правило, зависит от того, является ли файловая система чувствительной к регистру или нет.

Обратите внимание, что некоторые инструменты базы данных могут посылать идентификаторы, котируемые все время, поэтому в случаях, когда вы смешиваете запросы, сгенерированные каким-то инструментом (например, запрос CREATE TABLE, созданный Liquibase или другим инструментом миграции базы данных), с запросами вручную (например, простой JDBC в вашем приложении), вы должны убедиться, что случаи согласованы, особенно в базах данных, где котируемые и некотируемые идентификаторы отличаются (DB2, PostgreSQL и т. Д.)

0
задан Brian Bruman 18 January 2019 в 17:07
поделиться

1 ответ

Я бы предложил сначала вставить новый файл во временную таблицу, используя синтаксис LOAD DATA INFILE. Ниже приведен пример, вам может потребоваться изменить его в соответствии с вашим вариантом использования (из этого руководства, например, );

LOAD DATA INFILE 'c:/tmp/populations.csv' 
INTO TABLE Temp 
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS;

Затем следующий запрос может быть использован для обновления. существующие строки в основной таблице:

UPDATE Populations p
LEFT JOIN Temp t ON p.city = t.city
SET 
    p.population = COALESCE(t.population, p.population),
    p.status = CASE WHEN p.city IS NULL THEN 1 ELSE 0 END

И этот запрос вставит строки, которые еще не существуют:

INSERT INTO Populations
SELECT p.name, p.population, 1
FROM Temp t
WHERE NOT EXISTS (
    SELECT 1 FROM Populations WHERE name = t.name)
0
ответ дан GMB 18 January 2019 в 17:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: