2

主キー フィールドを SMALLINT から INT に変更する最良の方法 (低影響/低リスク) は何ですか? このフィールドは、「Identity Increment」を使用して自動インクリメントするように構成されています。

私は次のSQLから始めています:

ALTER TABLE category_types ALTER COLUMN id INT NOT NULL;

ただし、次のエラーが生成されます。

1 つ以上のオブジェクトがこの列にアクセスしているため、ALTER TABLE ALTER COLUMN id が失敗しました。

他に何が必要ですか?キーをドロップしてから再作成する必要がありますか? これは自動インクリメントに影響しますか?

注: テーブルの行数はそれほど多くないため、ソリューションのパフォーマンスは重要ではありません。

4

3 に答える 3

2

これは古い投稿であることは承知していますが、誰かがつまずいた場合に備えて: jciberta がわずかなエラーで回答しました。それは読むべきです:

-- smallint から int に変更

SET IDENTITY_INSERT category_types ON

ALTER TABLE category_types DROP CONSTRAINT CategoryTypes

ALTER TABLE category_types ALTER COLUMN id INT

ALTER TABLE category_types ADD CONSTRAINT CategoryTypesPK PRIMARY KEY (id)

SET IDENTITY_INSERT category_types OFF
于 2016-08-27T15:56:42.617 に答える
1

これは sql server management studio からの出力ですが、役立つはずです。これには、一時テーブルを作成してから、既存のデータを新しいテーブルにコピーすることが含まれます。元のテーブルを削除し、一時テーブルの名前を変更します。テーブルが空の場合、これは行われず、元のテーブルが変更されるだけです。SET IDENTITY_INSERT [table] ON/OFF挿入時に ID 列を設定できます。

/* To prevent any potential data loss issues, you should review this script in detail before running it outside the context of the database designer.*/
BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT
BEGIN TRANSACTION
GO
CREATE TABLE dbo.Tmp_category_types
    (
    id int NOT NULL IDENTITY (1, 1),
    )  ON [PRIMARY]
GO
ALTER TABLE dbo.Tmp_category_types SET (LOCK_ESCALATION = TABLE)
GO
SET IDENTITY_INSERT dbo.Tmp_category_types ON
GO
IF EXISTS(SELECT * FROM dbo.category_types)
     EXEC('INSERT INTO dbo.Tmp_category_types (id, x)
        SELECT CONVERT(int, id), x FROM dbo.category_types WITH (HOLDLOCK TABLOCKX)')
GO
SET IDENTITY_INSERT dbo.Tmp_category_types OFF
GO
DROP TABLE dbo.category_types
GO
EXECUTE sp_rename N'dbo.Tmp_category_types', N'category_types', 'OBJECT' 
GO
ALTER TABLE dbo.category_types ADD CONSTRAINT
    PK_category_types PRIMARY KEY CLUSTERED 
    (
    id
    ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

GO
COMMIT
于 2013-08-02T03:26:43.360 に答える
0

IDENTITY_INSERT をオフに設定する以外に、データ型を変更する前に関係(主キー、外部キー) のリンクを解除する必要があります。 その後、それらを再度リンクする必要があります。

例えば:

-- Change from smallint to int
SET IDENTITY_INSERT category_types OFF
alter table category_types drop CONSTRAINT CategoryTypesPK
alter table category_types alter column id int
alter table category_types add CONSTRAINT CategoryTypesPK PRIMARY KEY (id)
SET IDENTITY_INSERT category_types ON
于 2016-03-03T17:03:43.840 に答える