2009-03-27 8 views
6

SQLSERVER 2005 databsaeのテーブルの1行に1つのPK値を変更する必要があります。 PKは現在自動的にインクリメントしています。SQLサーバーの自動インクリメント列を更新します。

キーから自動インクリメントを一時的に削除し、変更を加えて戻す方法もあります。

データベースは稼働中です。 DBをダウンさせずにこの変更を安全に行う方法はありますか?

なぜですか?私の顧客はそのレコードの特定のIDを求めています。

私は何を恐れていますか?キーを変更している間にDBにレコードが追加されてしまい、フィールドをFKとして使用する別のテーブルのインデックスが乱れてしまいます。私はナッツですか?

+1

古い行を削除する前に、この主キーを参照するテーブルをすべて新しい値に更新する必要があることを忘れないでください。 – mrdenny

答えて

14

更新が動作しない - あなたは、新しいレコードを挿入し、代わりに、古いものを削除する必要があると思います...

set identity_insert mytable on 

insert mytable (myidentitycolumn, someothercolumn) 
select 42, someothercolumn 
from mytable 
where myidentitycolumn = 1; 

delete mytable where myidentitycolumn = 1; 

set identity_insert mytable off 
+0

これは動作しません= "ID列XXXXXを更新できません" –

+0

マット - あなたは正しいです。答えはそれに応じて更新され、+1もあなたの答えになりました。 –

+0

あなたは今すぐ行けます:) –

4

アイデンティティーを削除して再作成することによってのみ更新できます。ただし、IDの挿入をON(http://msdn.microsoft.com/en-us/library/aa259221(SQL.80).aspx)に設定し、必要なID値を持つ新しい行を挿入し、identの挿入をオフにしてから古いIDを削除することもできます。なぜあなたはこれをしたいのですか?

3
SET IDENTITY_INSERT yourTable ON 

INSERT INTO yourTable (col1, col2, col3) 
select newID, col2, col3 
FROM yourTable 
WHERE currentID = xxx 

SET IDENTITY_INSERT yourTable OFF 

を次の場所から他の挿入を防ぐために、テーブルをロックすることもできますIDENTITY_INSERTがオンの間は失敗します。

EDIT:元気ですか、私は元のレコードを削除することについての明白なビットを忘れました。

0
DECLARE @counter int 
SET @counter = 0 
UPDATE #tmp_Users 
SET @counter = counter = @counter + 1 
+0

詳細を編集してください。コード専用と「試してください」の回答は、検索可能なコンテンツが含まれていないため、推奨されません。なぜ誰かが「これを試してみる」べき理由を説明しません。 – abarisone

+0

この回答は低品質レビューキューに表示されました。おそらく、コードの説明を何も提供していないからです。このコードが質問に答える場合は、答えにコードを説明するテキストを追加することを検討してください。この方法では、より多くのアップボックスを取得し、質問者が新しい何かを学ぶのを助けます。 – lmo

関連する問題