Опять же, поскольку это операция, которую может выполнять база данных, я бы подавал входные данные в базу данных, а затем позволял ей решать, как обращаться с несколькими ключами.Я не рекомендую использовать CF для циклического просмотра ваших значений, а затем делать INSERT
.Для этого потребуется несколько поездок в базу данных и последующая обработка на сервере приложений, который на самом деле не нужен.
Я предлагаю использовать синтаксис INSERT....ON DUPLICATE KEY UPDATE...
MariaDB.Это также потребует, чтобы любое поле, в которое вы пытаетесь вставить, на самом деле имело ограничение UNIQUE
.Без этого ограничения самой вашей базе данных все равно, если у вас есть дубликаты данных, когда это может вызвать собственный набор проблем.
Для базы данных у нас есть
CREATE TABLE t1 (mycolor varchar(50)
, CONSTRAINT constraint_mycolor UNIQUE (mycolor)
) ;
INSERT INTO t1(mycolor)
VALUES ('black'),('white'),('red'),('blue'),('pink'),('orange'),('lime')
;
. ColdFusion:
<cfscript>
myInputValues = "green,blue,purple,white" ;
myQueryValues = "" ;
function sanitizeValue ( String inVal required ) {
// do sanitization stuff here
var sanitizedInVal = arguments.inVal ;
return sanitizedInVal ;
}
myQueryValues = myInputValues.listMap(
function(i) {
return "('" & sanitizeValue(i) & "')" ;
}
) ;
// This will take parameterization out of the cfquery tag and
preform sanitization and validation before building the
query string.
myQuery = new query();
myQuery.name = "myQuery";
myQuery.setDataSource("dsn");
sqlString = "INSERT INTO t1(mycolor) VALUES "
& myQueryValues
& " ON DUPLICATE KEY UPDATE mycolor=mycolor;"
;
myQuery.setSQL(sqlString);
myQueryResult = myQuery.execute().getResult();
</cfscript>
Сначала создайте свои входные значения (myInputValues
).Вы захотите выполнить проверку и очистку для них, чтобы предотвратить проникновение мерзости в вашу базу данных.Я создал функцию sanitizeValue
, которая будет заполнять операции очистки и проверки.
myQueryValues
станет строковым списком значений в правильном формате, который мы будем использовать для вставки в базу данных.
Затем мы просто создаем new query()
, используя myQueryValues
в sqlString
, чтобы получить наш запрос.Опять же, поскольку мы строим строку для нескольких значений до INSERT
, я не думаю, что есть способ для пользователя queryparam
для этих VALUES
.Но так как мы очистили нашу строку ранее, она должна делать многое из того, что cfqueryparam
делает в любом случае.
Мы используем синтаксис INSERT INTO .... ON DUPLICATE KEY UPDATE ...
MariaDB только для вставки уникальных значений.Опять же, это требует, чтобы у самой базы данных было ограничение для предотвращения дублирования в любом столбце, который мы вставляем.
Для демонстрации: https://dbfiddle.uk/?rdbms=mariadb_10.2&fiddle=4308da3addb9135e49eeee451c6e9e58
Это должно делать то, что вы ищете, не перегружая вашу базу данных.У меня нет сервера Lucee или MariaDB, настроенного для тестирования, поэтому вам придется попробовать его и посмотреть, как он работает.Я не знаю, насколько велика ваша база данных или станет, но запрос все равно должен выполняться довольно быстро.