(ページの作成: == 自動連番採用機能 == *あるカラムに値をセットしなくても自動的に連続した数値がセットされる機能は大抵のDBMSが持っています...)
 
11行目: 11行目:
 
=== IDENTITYプロパティを設定した列(以下ID列)を持つテーブルを作成  ===
 
=== IDENTITYプロパティを設定した列(以下ID列)を持つテーブルを作成  ===
  
CREATE TABLE hoge_table (
+
CREATE TABLE hoge_table (
id int NOT NULL IDENTITY (1, 1),
+
  id int NOT NULL IDENTITY (1, 1),
onamae varchar(40) NULL
+
  onamae varchar(40) NULL
);<br />
+
);
&color(blue){コマンドは正常に完了しました。};<br />
+
<span style="color:blue">コマンドは正常に完了しました。</span>
}}
+
  
 
=== ID列に値を指定してINSERTを実行  ===
 
=== ID列に値を指定してINSERTを実行  ===
  
INSERT INTO hoge_table values (1000, 'akiko');
+
INSERT INTO hoge_table values (1000, 'akiko');
 
+
<span style="color:red">メッセージ 8101、レベル 16、状態 1、行 1<br />列リストが使用されていて、IDENTITY_INSERT が ON のときに限り、テーブル 'hoge_table' の ID 列に明示的な値を指定できます。</span>
&color(red){メッセージ 8101、レベル 16、状態 1、行 1};<br />
+
&color(red){列リストが使用されていて、IDENTITY_INSERT が ON のときに限り、テーブル 'hoge_table' の ID 列に明示的な値を指定できます。};<br />
+
}}
+
  
 
=== ID列に値を指定してINSERTを実行  ===
 
=== ID列に値を指定してINSERTを実行  ===
*1.で列リストが指定されていないことがエラー原因の一つのようなので、列リストを明示してみる。
+
*列リストが指定されていないことがエラー原因の一つのようなので、列リストを明示してみる。
  
INSERT INTO hoge_table (id, onamae) values (1000, 'akiko');
+
INSERT INTO hoge_table (id, onamae) values (1000, 'akiko');
 
+
<span style="color:red">メッセージ 544、レベル 16、状態 1、行 1};<br />IDENTITY_INSERT が OFF に設定されているときは、テーブル 'hoge_table' の ID 列に明示的な値を挿入できません。</span>
&color(red){メッセージ 544、レベル 16、状態 1、行 1};<br />
+
&color(red){IDENTITY_INSERT が OFF に設定されているときは、テーブル 'hoge_table' の ID 列に明示的な値を挿入できません。};<br />
+
}}
+
  
 
=== IDENTITY_INSERTプロパティをセットしてINSERT  ===
 
=== IDENTITY_INSERTプロパティをセットしてINSERT  ===
 
+
SET IDENTITY_INSERT hoge_table ON
SET IDENTITY_INSERT hoge_table ON<br />
+
INSERT INTO hoge_table (id, onamae) values (1000, 'akiko');
INSERT INTO hoge_table (id, onamae) values (1000, 'akiko');
+
<span style="color:blue">(1 行処理されました)</span>
 
+
&color(blue){(1 行処理されました)};<br />
+
}}
+
  
 
=== データを確認  ===
 
=== データを確認  ===
 
*ID列に指定値がセットされていることを確認。
 
*ID列に指定値がセットされていることを確認。
  
select * from hoge_table<br />
+
select * from hoge_table
&color(blue){id          onamae};<br />
+
<span style="color:blue">id          onamae</span>
&color(blue){----------- ----------------------------------------};<br />
+
<span style="color:blue">----------- ----------------------------------------</span>
&color(blue){1000        akiko};<br />
+
<span style="color:blue">1000        akiko</span>
&color(blue){(1 行処理されました)};<br />
+
<span style="color:blue">(1 行処理されました)</span>
}}
+
  
 
=== ID列に値を指定せずにINSERT  ===
 
=== ID列に値を指定せずにINSERT  ===
 
+
SET IDENTITY_INSERT hoge_table OFF
SET IDENTITY_INSERT hoge_table OFF<br />
+
INSERT INTO hoge_table (onamae) values ('akiko');
INSERT INTO hoge_table (onamae) values ('akiko');
+
<span style="color:blue">(1 行処理されました)</span>
 
+
&color(blue){(1 行処理されました)};<br />
+
}}
+
  
 
=== データ確認  ===
 
=== データ確認  ===
 
*直前のID列の値“1000”に続く“1001”が採用されることを確認。
 
*直前のID列の値“1000”に続く“1001”が採用されることを確認。
  
select * from hoge_table<br />
+
select * from hoge_table
&color(blue){id          onamae};<br />
+
<span style="color:blue">id          onamae</span>
&color(blue){----------- ----------------------------------------};<br />
+
<span style="color:blue">----------- ----------------------------------------</span>
&color(blue){1000        akiko};<br />
+
<span style="color:blue">1000        akiko</span>
&color(blue){1001        akiko};<br />
+
<span style="color:blue">1001        akiko</span>
&color(blue){(2 行処理されました)};<br />
+
<span style="color:blue">(2 行処理されました)</span>
}}<br />
+

2010年10月23日 (土) 17:18時点における版

自動連番採用機能

  • あるカラムに値をセットしなくても自動的に連続した数値がセットされる機能は大抵のDBMSが持っています。
    • oracleならSEQUENCE、mysqlならAUTO_INCREMENT、postgresqlならserial型(=sequence)、そして、SQL ServerならIDENTITY。
    • ちなみにMS-Accessではオートナンバー型と呼んでいました。

データをセットしたい

  • システムが完成して、運用し始めたら勝手に連続した番号が振られて問題ないのですが、開発期間中や、初期データを投入する場合はこの列に特定の値をセットしたいことがあります。
  • そんなときに調べたことをメモしておきます。

作業ログ

IDENTITYプロパティを設定した列(以下ID列)を持つテーブルを作成

CREATE TABLE hoge_table (
 id int NOT NULL IDENTITY (1, 1),
 onamae varchar(40) NULL
);
コマンドは正常に完了しました。

ID列に値を指定してINSERTを実行

INSERT INTO hoge_table values (1000, 'akiko');
メッセージ 8101、レベル 16、状態 1、行 1
列リストが使用されていて、IDENTITY_INSERT が ON のときに限り、テーブル 'hoge_table' の ID 列に明示的な値を指定できます。

ID列に値を指定してINSERTを実行

  • 列リストが指定されていないことがエラー原因の一つのようなので、列リストを明示してみる。
INSERT INTO hoge_table (id, onamae) values (1000, 'akiko');
メッセージ 544、レベル 16、状態 1、行 1};
IDENTITY_INSERT が OFF に設定されているときは、テーブル 'hoge_table' の ID 列に明示的な値を挿入できません。

IDENTITY_INSERTプロパティをセットしてINSERT

SET IDENTITY_INSERT hoge_table ON
INSERT INTO hoge_table (id, onamae) values (1000, 'akiko');
(1 行処理されました)

データを確認

  • ID列に指定値がセットされていることを確認。
select * from hoge_table
id          onamae
----------- ----------------------------------------
1000        akiko
(1 行処理されました)

ID列に値を指定せずにINSERT

SET IDENTITY_INSERT hoge_table OFF
INSERT INTO hoge_table (onamae) values ('akiko');
(1 行処理されました)

データ確認

  • 直前のID列の値“1000”に続く“1001”が採用されることを確認。
select * from hoge_table
id          onamae
----------- ----------------------------------------
1000        akiko
1001        akiko
(2 行処理されました)

facebook slideshare rubygems github qiita