Подкачайте уникальные значения индексированного столбца в базе данных

Вот простой пример

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
55
задан Cartucho 21 November 2018 в 15:32
поделиться

6 ответов

Я думаю, что необходимо пойти для решения 2. Нет никакой функции 'подкачки' ни в каком варианте SQL, о котором я знаю.

, Если необходимо регулярно делать это, я предлагаю решение 1, в зависимости от того, как другие части программного обеспечения используют эти данные. У Вас могут быть проблемы блокировки, если Вы не осторожны.

, Но короче говоря: нет никакого другого решения, чем те, Вы обеспечили.

13
ответ дан Daan 7 November 2019 в 07:28
поделиться

В дополнение к ответу 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))
6
ответ дан 7 November 2019 в 07:28
поделиться

Я также думаю, что № 2 является лучшим выбором, хотя я, несомненно, обернул бы его в транзакцию в случае, если что-то идет неправильная середина обновления.

альтернатива (так как Вы спросили) к обновлению значений Уникального индекса с различными значениями должна будет обновить все другие значения в строках к той из другой строки. Выполнение этого означает, что Вы могли оставить значения Уникального индекса в покое, и в конце, Вы заканчиваете с данными, которые Вы хотите. Будьте осторожны, хотя, в случае, если некоторые другие ссылки на таблицу эта таблица в отношениях Внешнего ключа, что все отношения в DB остаются неповрежденными.

3
ответ дан Yaakov Ellis 7 November 2019 в 07:28
поделиться

Принятие Вас знает 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
3
ответ дан takrl 7 November 2019 в 07:28
поделиться

У меня такая же проблема. Вот предлагаемый мной подход в PostgreSQL. В моем случае мой уникальный индекс - это значение последовательности, определяющее явный пользовательский порядок в моих строках. Пользователь будет перемещать строки в веб-приложении, а затем отправлять изменения.

Я планирую добавить триггер «до». В этом триггере всякий раз, когда обновляется значение моего уникального индекса, я проверяю, содержит ли уже какая-либо другая строка мое новое значение. Если так, я передам им свое старое значение и фактически украду его.

Я надеюсь, что PostgreSQL позволит мне сделать это перемешивание в триггере before.

Я отправлю ответ и позволю вы знаете мой пробег.

2
ответ дан 7 November 2019 в 07:28
поделиться

Oracle имеет отложенную проверку целостности, которая решает именно эту проблему, но она недоступна ни в SQL Server, ни в MySQL.

1
ответ дан 7 November 2019 в 07:28
поделиться
Другие вопросы по тегам:

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