Свопинг двух строк DB, не нарушая ограничения

Для Смешения немного известного приема должно добавить эти атрибуты к Вашему usercontrol или окну:

 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
mc:Ignorable="d"
       d:DesignHeight="500" d:DesignWidth="600"

Это установит расчетную высоту и ширину к 500 и 600 соответственно. Однако это будет только работать на разработчика смешения. Не Разработчик Visual Studio.

До Разработчика Visual Studio, Ваша техника - все, что работает. Который является, почему я не использую Разработчика Visual Studio.;)

5
задан gbn 14 May 2010 в 19:29
поделиться

4 ответа

Вы не можете откладывать проверки ограничений в SQL Server по нескольким операторам (если вы не ОТКЛЮЧИТЕ), поэтому вы должны избегать конфликта или делать это в одном операторе

update
    regionkey 
set
    region= CASE areaid WHEN 101 THEN 'ILLI' ELSE 'MICH' END, 
    locale= CASE areaid WHEN 101 THEN 'CHIC' ELSE 'DETR' END
where
    areaid IN (101, 102); 

или, более традиционно (в транзакция эта)

update regionkey 
     set region='AAAA', locale='BBBB' where areaid = 101;
update regionkey 
     set region='MICH', locale='DETR' where areaid = 102;
update regionkey 
     set region='ILLI', locale='CHIC' where areaid = 101;

Edit: Почему бы не поменять местами ключи, а не значения? Обычно он дает нормальный результат, если только areaid не имеет какого-либо значения

update
    regionkey 
set
    areaid = 203 - areaid 
where
    areaid IN (101, 102); 
8
ответ дан 14 December 2019 в 01:10
поделиться

Лучше всего сделать три обновления. Обновите первую запись до временного набора значений, обновите вторую запись, а затем повторно обновите первую запись до требуемых значений.

1
ответ дан 14 December 2019 в 01:10
поделиться

Вы пробовали простой акт включения его в транзакцию?

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

0
ответ дан 14 December 2019 в 01:10
поделиться

Одно из предложений, которое может быть не самым безопасным для больших наборов записей, - это установить для обеих записей как «» для региона и локали, а затем выполнить два обновления операторов, по одному для каждой записи, например:

UPDATE
    regionkey
SET
   region = '    ',
   locale = '    '
WHERE
    areaid in (101,102)

UPDATE
    regionkey
SET
    region = 'ILLI',
    locale = 'CHIC'
WHERE
    areaid = 101

UPDATE
    regionkey
SET
    region = 'MICH',
    locale = 'DETR'
WHERE
    areaid = 102

Как я уже сказал, это, вероятно, не самый безопасный способ, но для небольшого набора данных все должно быть в порядке.

ОБНОВЛЕНИЕ: Ларри правильно указал, что первый Оператор UPDATE нарушит ограничение UNIQUE. Используйте вместо этого для первого ОБНОВЛЕНИЯ:

UPDATE
    regionkey
SET
    region = areaid,
    locale = areaid
WHERE
    areaid in (101,102)

Таким образом, каждый промежуточный регион и локаль будут (или должны быть) уникальными.

0
ответ дан 14 December 2019 в 01:10
поделиться