Спецификация 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 и т. Д.)
Я бы предложил сначала вставить новый файл во временную таблицу, используя синтаксис 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)