2

ID 列を含むテーブルがありますが、ID プロパティを削除できません。

無効にする方法はありますか?または、ID プロパティなしでテーブル全体のコピーを作成する方法はありますか?

4

2 に答える 2

5

クラスター化インデックスによって参照されている列は削除できない可能性があることに注意してください。また、SqlAzure テーブルには常にクラスター化インデックスが必要なため、テーブルのすべてのクラスター化インデックスを削除することはできません。

これは、次のフープをジャンプする必要がある場合があることを意味します (少なくとも最後のクラスター化インデックスについては、これが主キーになる可能性があります)。

  • クラスター化インデックスの名前を変更する
  • テーブルの一時バージョンを作成します (新しいクラスター化インデックスを使用)
  • 現在のテーブルからデータをコピーする
  • 現在のテーブルをドロップする
  • 一時テーブルの名前を現在の名前に変更します

これは大まかに次のようになります。

-- Rename clustered index
EXECUTE sp_rename N'PK_My_Current_PK', N'PK_My_Current_PK_OLD',  'OBJECT'

-- If you have any FK constraints on the table, then drop them
ALTER TABLE dbo.MyTable DROP CONSTRAINT FK_My_Foreign_Key

-- Create the new version of your table - because this is SQLAzure it must have a clustered index
CREATE TABLE dbo.tmp_MyTable (
    MyID int NOT NULL,
    CONSTRAINT PK_My_Current_PK PRIMARY KEY CLUSTERED (MyID)
)

-- Copy the data into the temp table from the old table
INSERT INTO dbo.tmp_MyTable (MyID)
    SELECT MyID FROM dbo.MyTable 

-- Drop the old table 
DROP TABLE dbo.MyTable 

-- Rename the new table
EXECUTE sp_rename N'tmp_MyTable', N'MyTable', 'OBJECT' 

-- Recreate any foreign key constraints
ALTER TABLE dbo.MyTable WITH CHECK ADD FK_My_Foreign_Key FOREIGN KEY (MyID)
    REFERENCES dbo.MyForeignTable (MyID)

それが役立つことを願っています

編集: @PhilBolduc が指摘したように、SqlAzure テーブルには主キーではなく、クラスター化されたインデックスが必要です。それに応じて上記の用語を修正しました-答えの原則はまだ残っています。

于 2012-10-25T13:29:27.523 に答える
1

残念ながら、削除せずに ID 列を削除することはできません。または、一時的な名前で新しい列を追加し、新しい列の値を更新してから、前の列を削除します。

ALTER TABLE dbo.tablename ADD newcolumnname INT

UPDATE dbo.tablename SET newcolumnname = oldcolumnname FROM dbo.tablename

ALTER TABLE dbo.tablename DROP COLUMN oldcolumnname

それはそれを行う必要があります。私があなたの質問を誤解していない限り?

于 2012-10-25T13:18:25.977 に答える