読者です 読者をやめる 読者になる 読者になる

misc.log

日常茶飯事とお仕事と

SQL Serverでの「オートナンバー」型

業務日誌 SQLServer DB

すっかり忘れてる。っていうか以前からそうだったっけ?

SQL Serverで通し番号のような、特に人間が指定しなくても勝手に決めてもらって構わない番号などを生成するデータ型が何だったか思い出せず、調べてしまいました。「Identity列」として対象の列を指定するのですね。

f:id:frontline:20131014151938j:plain

てっきり「Autonumber(オートナンバー)」だとおもってたらそれはAccessでした。ごめんなさい。

ところで、すでに作成したテーブル(データはまだゼロ件)に対して、特定のフィールドをIdentity列として指定、変更を保存しようとするとこんなメッセージが出るのですが…

f:id:frontline:20131014152325j:plain

変更の保存が許可されていません。行った変更には、次のテーブルを削除して再作成することが必要になります。再作成できないテーブルに変更を行ったか、テーブルの再作成を必要とする変更を保存できないようにするオプションが有効になっています。

まぁ確かにすでにデータがある場合などにIdentity列に設定変更したら、データの再作成が必要になることもあるし、ムリなのはわかるのだけど……データが無くてもだめなのか。

テーブル作り直し?ってことはこのあたり、きっちりと事前に計画する必要があったのですね。

面倒くさいのでCreate文で作り直す

フィールド名とかまた打ち直すの面倒くさいので、すでに作ったIdentity列の無いテーブルCreate文をスクリプトとしてはき出して、それを書き換えて新しいテーブルを作ります。

まずは最初に作ったテーブルのSQL

USE [PhotoStock]
GO

/****** Object:  Table [dbo].[AllPhoto2]    Script Date: 2013/10/14 15:38:45 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[AllPhoto](
	[PhotoNo] [int] NOT NULL,
	[DateTaken] [datetime] NULL,
	[Size] [int] NULL,
	[StorageLocation] [nvarchar](max) NOT NULL,
	[Title] [nvarchar](50) NULL,
	[Notes] [nvarchar](max) NULL,
 CONSTRAINT [PK_AllPhoto] PRIMARY KEY CLUSTERED 
(
	[PhotoNo] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO

Identity列にしたいのは、1フィールド目の「PhotoNo」フィールド。Create Tableの次の行、

[PhotoNo] [int] NOT NULL,

これを書き換えます。

[PhotoNo] [int] Identity(1,1) NOT NULL,

そして実行。ただし、このときにテーブル名とインデックスの名前を変えるのを忘れないようにしてください(重複でエラーが起きます)。ま、修正に自信があるなら前のテーブルは消してしまっても構いませんけどね。

Create文の作成は、既存テーブルを元にしたスクリプトの生成先を「新しいクエリ エディター ウィンドウ」に指定すると、Management Studio上のクエリエディタに直接スクリプトが表示されるので楽ちんです。

f:id:frontline:20131014154715j:plain

さて、テーブル名やインデックスの競合を回避した名称等に調整してから、実行。問題のフィールド「PhotoNo」のプロパティを見るとこんな感じに「ID」と「シード」「増分」が設定されており、無事Identityフィールドとして定義されたことがわかります。

f:id:frontline:20131014154908j:plain


SQL Server 2012の教科書 開発編

SQL Server 2012の教科書 開発編