本記事では、テーブルの作成、修正、削除方法とプライマリ、ユニーク、外部キー制約など制約の設定方法のサンプルを掲載します。

動作確認は SQL Server 2005 Developer Edition で行っています。

1. テーブル定義

テーブルの作成、修正、削除と列の修正、削除方法のサンプルを記載します。

1.1 テーブルの作成,修正、削除

テーブルの作成はCREATE TABLE、 変更はALTER TABLE, 削除は DROP TABLE 文を使用します。テーブル情報の取得にはsp_helpストアドプロシージャが使用できます。

USE [SampleDB]
GO
-- 簡単なテーブルの定義例
CREATE TABLE dbo.Product1
(
	ProductID int NOT NULL,
    Name nvarchar(64) NOT NULL,
    Price money
)
GO

-- テーブルを削除する
DROP TABLE dbo.Product1

-- テーブル情報を取得する
exec sp_help 'dbo.Product1'

サロゲートキー(IDENTITY列)列を持つテーブルを作成する場合は次のように記述します。IDENTITY列に割り当てられている最大の値を取得するには、DBCC CHECKIDENT を使用します。

-- サロゲートキー
CREATE TABLE dbo.SampleUser
(
  UserId int NOT NULL IDENTITY(1,1) PRIMARY KEY,
  Name nvarchar(65) NOT NULL
)
-- IDENTITY列に割り当てられた最大の値を取得するには
-- DBCC CHECKIDENTを使用します。
DBCC CHECKIDENT('dbo.SampleUser', NORESEED)

1.2 列定義の修正、削除

列定義の修正はALTER TABLE ALTER COLUMN 文を使用します。 列を削除する場合は、ALTER TABLE DROP COLUMN 文を使用します。列の追加、修正も下記サンプルALTER TABLE 文を使用して行えます。

列を追加する場合で、すでにテーブルのレコードが存在する場合は、NULL許可列かDEFAULT句が定義されている列のみ追加を行えます。

-- テーブルの列定義の変更
ALTER TABLE dbo.Product1
ALTER COLUMN ProductID nvarchar(10) NOT NULL
GO

-- テーブルに列を追加
-- テーブルにデータがある場合は、
-- NULL許可または、DEFAULT定義がされている
-- カラムのみ追加できる
ALTER TABLE dbo.Product1
ADD Tax float NULL

-- カラムを削除する
ALTER TABLE dbo.Product1
DROP COLUMN Tax

-- 計算列の追加
ALTER TABLE dbo.Product1
ADD CatalogPrice AS (Price*Tax)

2. 制約の設定

制約を定義する方法や修正する方法を掲載します。インデックスに関しては[T-SQL] インデックスを操作する を参照してください。

2.1 プライマリーキー制約

プライマリキー列を定義する方法を掲載します。プライマリキーはテーブル作成時や作成後に設定できます。

-- 簡単なテーブルの定義例
CREATE TABLE dbo.Product1
(
	ProductID int NOT NULL,
    Name nvarchar(64) NOT NULL,
    Price money
)
GO
-- キーを設定
ALTER TABLE dbo.Product1
ADD CONSTRAINT PK_Product1
PRIMARY KEY (ProductID)
GO

-- Primary Key 付きでテーブル定義
CREATE TABLE dbo.ProductCatalog
(
	CatalogID int NOT NULL PRIMARY KEY,
    CatalogName nvarchar(128) NOT NULL
)
GO

-- Primary Key (制約名指定)でテーブル作成
CREATE TABLE dbo.UserRoles
(
	UserId int NOT NULL,
    RoleId int NOT NULL,
    CONSTRAINT PK_UserRole PRIMARY KEY (UserId, RoleId)
)
GO

2.2 外部キー制約

外部キー制約は、テーブル作成時および、作成後、に制約を追加できます。制約はCONSTRAINT FOREIGN KEY 文を指定して作成します。外部キー制約を一時的に有効、無効にする場合は、ALTAR TABLE NOCHECK/CHECK 文を使用します。

-- テーブル定義時に外部キー制約を設定する例
CREATE TABLE dbo.UserRoles
(
	UserId int NOT NULL,
    RoleId int NOT NULL,
    CONSTRAINT PK_UserRole PRIMARY KEY (UserId, RoleId),
    CONSTRAINT FK_UserRoles_SampleUser
    FOREIGN KEY (UserId)
    REFERENCES dbo.SampleUser(UserId)
)
GO

-- 作成したテーブルの列に外部キー制約を
-- 設定する例
DROP TABLE dbo.UserRoles
GO

CREATE TABLE dbo.UserRoles
(
	UserId int NOT NULL,
    RoleId int NOT NULL,
    CONSTRAINT PK_UserRole PRIMARY KEY (UserId, RoleId)
)
GO
-- 外部キー制約を追加する
ALTER TABLE dbo.UserRoles
ADD CONSTRAINT FK_UserRolesSampleUser
FOREIGN KEY (UserId)
REFERENCES dbo.SampleUser(UserId)

-- 外部キー制約を無効にする
ALTER TABLE dbo.TestTable
NOCHECK CONSTRAINT FK_UserRolesSampleUser

-- 外部キー制約を有効にする
ALTER TABLE dbo.TestTable
CHECK CONSTRAINT FK_UserRolesSampleUser

2.3 UNIQUE / CHECK / DEFAULT 制約

UNIQUE は 列(列の組み合わせ)が一意であること、CHECKは列が特定の制約を満たしていること、DEFAULT はINSERT 時に値が指定されたなかった場合の既定値を定義する制約です。UNIQUE 制約が列に設定されている場合、その列がNULL となる行が1つだけ許容されます。

次のサンプルに、UNIQUE, CHECK, DEFAULT 制約をテーブル定義時に設定する方法と、テーブル作成後に設定するクエリ例を記載しています。サンプルにあるように、制約を削除する場合はDROP CONSTRAINT 文を使います。CHECK 制約の有効・無効なFOREIGN KEY 制約と同様にCHECK CONSTRAINT文で設定できます。

CREATE TABLE dbo.TestTable
(
  ID int IDENTITY(1,1)  PRIMARY KEY,
  FriendlyNumber int NOT NULL UNIQUE,
  FirstName nvarchar(100) NOT NULL,
  LastName  nvarchar(100) NULL,
  MiddleName nvarchar(100) NULL,
  CreatedOn DateTime NULL DEFAULT GETDATE(),
  Sex nchar(1) NOT NULL CHECK(Sex = 'M' OR Sex = 'F'),
  Old int NULL,
  CONSTRAINT UQ_FirstNameLastName
  UNIQUE (FirstName, LastName)
)
-- UNIQUE 制約を追加する
ALTER TABLE dbo.TestTable
ADD CONSTRAINT UQ_MiddleName
UNIQUE (MiddleName)
GO

-- 制約を削除する
ALTER TABLE dbo.TestTable
DROP CONSTRAINT UQ_MiddleName

-- DEFAULT制約を設定する
ALTER TABLE dbo.TestTable
ADD CONSTRAINT DF_MiddleName
DEFAULT 'middle'
FOR MiddleName

-- CHECK制約を設定する
-- WITH NOCHECK とすると、既存のレコードに対する
-- チェックは行われず制約が追加される
ALTER TABLE dbo.TestTable
WITH CHECK
ADD CONSTRAINT CK_Old
CHECK( 0 <= Old And 120 >= Old)

-- 制約を無効にする
ALTER TABLE dbo.TestTable
NOCHECK CONSTRAINT CK_Old

-- 制約を有効にする
ALTER TABLE dbo.TestTable
CHECK CONSTRAINT CK_Old

3. まとめ

今回の説明は以上です。誤り指摘点がありましたらご連絡ください。