Вот простой пример
from pandas import DataFrame
# Create data set
d = {'Revenue':[100,111,222],
'Cost':[333,444,555]}
df = DataFrame(d)
# mask = Return True when the value in column "Revenue" is equal to 111
mask = df['Revenue'] == 111
print mask
# Result:
# 0 False
# 1 True
# 2 False
# Name: Revenue, dtype: bool
# Select * FROM df WHERE Revenue = 111
df[mask]
# Result:
# Cost Revenue
# 1 444 111
Я думаю, что необходимо пойти для решения 2. Нет никакой функции 'подкачки' ни в каком варианте SQL, о котором я знаю.
, Если необходимо регулярно делать это, я предлагаю решение 1, в зависимости от того, как другие части программного обеспечения используют эти данные. У Вас могут быть проблемы блокировки, если Вы не осторожны.
, Но короче говоря: нет никакого другого решения, чем те, Вы обеспечили.
В дополнение к ответу Andy Irving
это работало на меня (на SQL Server 2005) в аналогичной ситуации, где у меня есть составной ключ, и я должен подкачать поле, которое является частью ограничения на уникальность данных.
ключ: ИЗОДРОМНЫЙ С ПРЕДВАРЕНИЕМ, LNUM rec1: 10, 0 rec2: 10, 1 rec3: 10, 2
и я должен подкачать LNUM так, чтобы результат был
ключ: ИЗОДРОМНЫЙ С ПРЕДВАРЕНИЕМ, LNUM rec1: 10, 1 rec2: 10, 2 rec3: 10, 0
SQL было нужно:
UPDATE DOCDATA
SET LNUM = CASE LNUM
WHEN 0 THEN 1
WHEN 1 THEN 2
WHEN 2 THEN 0
END
WHERE (pID = 10)
AND (LNUM IN (0, 1, 2))
Я также думаю, что № 2 является лучшим выбором, хотя я, несомненно, обернул бы его в транзакцию в случае, если что-то идет неправильная середина обновления.
альтернатива (так как Вы спросили) к обновлению значений Уникального индекса с различными значениями должна будет обновить все другие значения в строках к той из другой строки. Выполнение этого означает, что Вы могли оставить значения Уникального индекса в покое, и в конце, Вы заканчиваете с данными, которые Вы хотите. Будьте осторожны, хотя, в случае, если некоторые другие ссылки на таблицу эта таблица в отношениях Внешнего ключа, что все отношения в DB остаются неповрежденными.
Принятие Вас знает PK этих двух строк, которые Вы хотите обновить... Это работает в SQL Server, не может выступить за другие продукты. SQL (предположен быть) атомарный на уровне оператора:
CREATE TABLE testing
(
cola int NOT NULL,
colb CHAR(1) NOT NULL
);
CREATE UNIQUE INDEX UIX_testing_a ON testing(colb);
INSERT INTO testing VALUES (1, 'b');
INSERT INTO testing VALUES (2, 'a');
SELECT * FROM testing;
UPDATE testing
SET colb = CASE cola WHEN 1 THEN 'a'
WHEN 2 THEN 'b'
END
WHERE cola IN (1,2);
SELECT * FROM testing;
, таким образом, Вы пойдете от:
cola colb
------------
1 b
2 a
к:
cola colb
------------
1 a
2 b
У меня такая же проблема. Вот предлагаемый мной подход в PostgreSQL. В моем случае мой уникальный индекс - это значение последовательности, определяющее явный пользовательский порядок в моих строках. Пользователь будет перемещать строки в веб-приложении, а затем отправлять изменения.
Я планирую добавить триггер «до». В этом триггере всякий раз, когда обновляется значение моего уникального индекса, я проверяю, содержит ли уже какая-либо другая строка мое новое значение. Если так, я передам им свое старое значение и фактически украду его.
Я надеюсь, что PostgreSQL позволит мне сделать это перемешивание в триггере before.
Я отправлю ответ и позволю вы знаете мой пробег.
Oracle имеет отложенную проверку целостности, которая решает именно эту проблему, но она недоступна ни в SQL Server, ни в MySQL.