-1

こんにちは、次の方法でテーブルの外部キー値を更新したいと思います。

FK
1 to 5
2 to 6
3 to 7
4 to 1
5 to 2
6 to 3
7 to 4

ただし、上記を順番に実行すると、次のようになります。

update table set fk = 5 where fk=1

値 5 を更新する場合は、値 1 を 5 に変更した以前の更新ステートメントの結果と値を混合します。

以前の結果と混合せずにこれらの値を更新するにはどうすればよいですか。

4

3 に答える 3

2

テーブルに一時的に列Updated BITを追加し、行の値を更新するときに、このビットを1(True - 更新済み) に設定して、更新済みの行を更新しないようにすることができます。

ステップ 1: 値を含む新しい列を追加します0(false - まだ更新されていません):

ALTER TABLE dbo.YourTable 
  ADD Updated BIT NOT NULL DEFAULT(0) WITH VALUES

ステップ 2: 更新を行います -Updated国旗を尊重してください!

UPDATE dbo.YourTable 
SET fk = 5, Updated = 1
WHERE fk = 1 AND Updated = 0 

ステップ 3: すべてが更新されたら、列を再度ドロップします。

ALTER TABLE dbo.YourTable 
  DROP COLUMN Updated 
于 2013-04-08T15:48:30.437 に答える
2

FreshPrince が提案したように、追加の列を使用できます。新しい列を追加して適切な値に設定し、キーを新しい列に変更します。

別のアプローチは、その範囲外の値のセットを使用することです。これにより、列を追加および削除する必要がなくなります。そう...

update table set fk = 15 where fk=1

1 to 15
2 to 16
3 to 17
4 to 11
5 to 12
6 to 13
7 to 14

次に、すべての行から 10 を減算する単純な更新です。

update table set fk = fk - 10

外部キー制約も削除して元に戻す必要があります。

于 2013-04-08T15:48:52.790 に答える
0

CASE 式を使用して、単一の UPDATE ステートメントで新しい値を指定することもできます。

UPDATE YourTable 
SET fk=CASE fk
    WHEN 1 THEN 5
    WHEN 2 THEN 6
    WHEN 3 THEN 7
    WHEN 4 THEN 1
    WHEN 5 THEN 2
    WHEN 6 THEN 3
    WHEN 7 THEN 4
END
WHERE fk IN (1,2,3,4,5,6,7)

この特定のケースでは、以下も使用できます。

UPDATE YourTable 
SET fk=(fk+3)%7+1
WHERE fk BETWEEN 1 AND 7

ラズヴァン

于 2013-04-08T18:28:43.173 に答える