すっかり忘れてる。っていうか以前からそうだったっけ?
SQL Serverで通し番号のような、特に人間が指定しなくても勝手に決めてもらって構わない番号などを生成するデータ型が何だったか思い出せず、調べてしまいました。「Identity列」として対象の列を指定するのですね。
てっきり「Autonumber(オートナンバー)」だとおもってたらそれはAccessでした。ごめんなさい。
ところで、すでに作成したテーブル(データはまだゼロ件)に対して、特定のフィールドをIdentity列として指定、変更を保存しようとするとこんなメッセージが出るのですが…
変更の保存が許可されていません。行った変更には、次のテーブルを削除して再作成することが必要になります。再作成できないテーブルに変更を行ったか、テーブルの再作成を必要とする変更を保存できないようにするオプションが有効になっています。
まぁ確かにすでにデータがある場合などに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上のクエリエディタに直接スクリプトが表示されるので楽ちんです。
さて、テーブル名やインデックスの競合を回避した名称等に調整してから、実行。問題のフィールド「PhotoNo」のプロパティを見るとこんな感じに「ID」と「シード」「増分」が設定されており、無事Identityフィールドとして定義されたことがわかります。
- 作者: 松本美穂,松本崇博
- 出版社/メーカー: ソシム
- 発売日: 2012/09/18
- メディア: 単行本
- クリック: 4回
- この商品を含むブログ (2件) を見る