データ定義命令の基本とも言えるテーブルの作成、削除、構造の変更について、詳しく説明していきましょう。
- テーブルを作る~CREATE TABLE -
新規にテーブルを作るにはCREATE TABLE命令を使います。書式は以下のようになります。
CREATE TABLE <テーブル名> (<テーブル構造>)
<テーブル構造>では、以下のようなフィールドとデータ型の組を「,」で区切って列挙します。
<フィールド名> <データ型(桁数)>
文字列や整数、通貨型では( )内に桁数(文字数)を指定します。
表1に示した構成のテーブル「商品_tst」を生成するなら、以下のようなSQLを記述します。
CREATE TABLE 商品_tst (
商品ID int,
品名 nvarchar(30),
販売単価 money(8),
仕入単価 money(8),
仕入先ID int
)
表1:テーブル「商品_tst」の構成
(サンプル・データベースのテーブル「商品_mr」と同じです)
フィールド名 |
型 |
桁数 |
商品ID |
int |
---- |
品名 |
nvarchar |
30 |
販売単価 |
money |
---- |
仕入単価 |
money |
---- |
仕入先ID |
int |
---- |
- テーブルの構造を変更する~ALTER TABLE -
既存のテーブルの構造を書き換えるには、ALTER TABLE命令を使います。書式は以下のようになります。
ALTER TABLE <テーブル名> (<変更内容>)
<変更内容>では、新たなフィールドの追加、既存のフィールドの削除、既存のフィールドの名前や型の変更ができます。
・フィールドの追加
フィールドを追加するには、以下のような書式を用います。
ADD <名前> <型(桁数)>)
テーブル「商品_tst」にvarchar型8桁の「単位」フィールドを追加するなら、以下のようなSQLを記述します。
ALTER TABLE 商品_tst
ADD 単位 varchar(8)
・フィールドの削除
フィールドを削除するには、以下のような書式を用います。
DROP COLUMN <フィールド名>
テーブル「商品_tst」から「単位」フィールドを削除するなら、以下のようなSQLを記述します。
ALTER TABLE 商品_tst
DROP COLUMN 単位
・フィールドの型変更
フィールドの型を変更するには、以下のような書式を用います。
ALTER COLUMN <フィールド名> <型(桁数)>
「text、ntext、image、timestamp型」のフィールドは変更できません。
また、計算式フィールドと、計算式フィールドの式中で参照されている列も変更できません。
テーブル「商品_tst」の「品名」フィールドを40桁のnvarchar型に変更するなら、以下のようなSQLを記述します。
ALTER TABLE 商品_tst
ALTER COLUMN 品名 nvarchar(40)
新しいデータ型は、既存の型から自動的に変換されるものでなければなりません。int型をmoney型やfloat型に変換するような場合は問題ありませんが、文字列型をfloat型やdatetime型に変換する場合には問題が生じます。
文字列型フィールドの桁数を既存のものより小さくすると、すでに保存されていた文字列データが切り捨てられる場合があります。数値型フィールドを既存の型より小さい値しか保存できない型に変更すると、すでに保存されていた数値データが丸められることがあります。
- 変更しないのが普通 -
基本的に既存のテーブル構造を変更するという行為は、よほどの事情がない限り必要性がありません。
もし、データベースを運用中にそのような必要が生じたなら、それは基本設計の段階で何らかのミスがあったものと言えるでしょう。
社内規則や法律などによってデータの取り扱いを変更せざるを得ないような場合は、旧テーブルを一時的に待避させて新たな構造のテーブルと入れ替えるなど、変更をたやすく行えるような仕組みを作っておくべきです。
突発的な変更を余儀なくされた場合も、テーブルまたはデータベースそのものを置き換える方が簡単で安全です。アプリケーション自体をそのような突発的な変更に備えられる仕様として設計しておくべきでしょう。
- テーブルを削除する~DROP TABLE -
既存のテーブルを削除するには、DROP TABLE命令を用います。書式は以下のようになります。
DROP TABLE <テーブル名>
テーブル「商品_tst」をデータベースから削除するには、以下のようなSQLを記述します。
DROP TABLE 商品_tst
- 開発者・管理者の命令 -
先述したように、テーブルの作成・変更・削除の処理は通常の業務で実行することはありません。テーブルだけではなく、各種オブジェクトを作成・削除・変更してデータベースの構造を変えてしまうと、それを利用するアプリケーションの仕様に影響してしまいます。従って、一度作ったデータベースの構造を変更することは非常に稀です。
年度が変わって前年までのデータを保管用のデータベースに移動し、新年度用に新たなテーブルを用意する場合でも、既存のテーブルからDELETE命令でレコードを削除するだけで対応できます(自動増加のインデックス値を初期化するなど、いくつかの作業が必要にはなりますが)。
データ定義命令は、主にシステム開発で最初にデータベースを作るときや、仕様を見直してデータベースの構造を変更するような場合に用いることになります。その場合も、直接クエリアナライザでSQLを記述するのではなく、SQLを記述したテキストファイル(拡張子.sqlのクエリファイルも、中身はテキストファイルです)を準備しておき、テーブル保守(生成・変更・削除)用の簡単なアプリケーションに読み込ませるのが一般的です。
また、データベース“dbo.master”に同じような処理を行うストアドプロシージャを作っておく場合もあります。
いずれにせよ、アプリケーションの開発者やデータベースの管理者だけが扱う命令であることに変わりはありません。
《SQL Serverのデータ型》
CREATE TABLE命令のところでデータ型に触れたので、SQL Serverで用いられる主なデータ型を紹介しておきます。
表2:SQL Serverで用いられる主なデータ型
型 |
機能 |
bigint |
-2^63(@@ -2の63乗)(-9223372036854775808)~2^63(@@ 2の63乗)-1(9223372036854775807)までの整数を格納します。 |
int |
-2^31(-2,147,483,648)~2^31-1(2,147,483,647)までの整数を格納します。 |
smallint |
-2^15(-32,768)~2^15-1(32,767)までの整数を格納します。 |
tinyint |
0から255までの整数を格納します。 |
bit |
0または1のいずれかを格納します。 |
decimal |
-10^38+1~10^38?1までの固定長の有効桁数と、小数点以下の桁数を格納します。 |
numeric |
decimal型と同じです。 |
money |
-2^63(-922,337,203,685,477.5808)~2^63-1(+922,337,203,685,477.5807)までの金額を、通貨単位の一万分の1までの精度で格納します。 |
smallmoney |
-214,748.3648~214,748.3647までの金額を、通貨単位の一万分の1までの精度で格納します。 |
float |
-1.79E+308~1.79E+308までの浮動小数点数を格納します。 |
real |
-3.40E+38~3.40E+38までの浮動小数点数を格納します。 |
datetime |
1753年1月1日~9999年12月31日までの日付と時刻を格納します。精度は3.33ミリ(300分の1秒)です。 |
smalldatetime |
1900年1月1日~2079年6月6日までの日付と時刻を格納します。精度は分単位です。 |
char |
固定長のUnicode以外の文字データを8,000文字以内で格納します。 |
varchar |
可変長のUnicode以外のデータを8,000文字以内で格納します。 |
text |
2^31-1(2,147,483,647)文字以内の可変長のUnicode以外のデータを格納します。 |
nchar |
固定長のUnicodeデータを4,000文字以内で格納します。 |
nvarchar |
可変長のUnicodeデータを4,000文字以内で格納します。 |
ntext |
2^31-1(2,147,483,647)文字以内の可変長のUnicodeデータを格納します。 |
binary |
8,000バイト以内の固定長バイナリデータを格納します。 |
varbinary |
8,000バイト以内の可変長バイナリデータを格納します。 |
image |
2^31-1(2,147,483,647)バイト以内の可変長バイナリデータを格納します。主に画像データに用います。 |
|
|
|
|