値の制約 / PRIMARY KEY / UNIQUE / NOT NULL


データ値の制約

SQL の表定義ではデータ値に制約を持たせることで、登録されるデータが常に正しい状態を保つことができます。

制約には「列制約」と「テーブル制約」という 2つの基本制約があります。
両者の違いは、列制約が列のみに適用されるのに対し、テーブル制約が列のグループに適用されるということです。

CREATE TABLE 文では、列定義のデータ型の後ろに列制約を追加し、最後にカンマを付けます。
テーブル制約は、テーブル定義の最後の列定義の後ろに配置し、最後に閉じカッコをつけます。

CREATE TABLE テーブル名
    (列名 データ型 列制約....,
     ........................,
     ........................,
     テーブル制約) ;

テーブル制約はALTER TABLE分を使うことで作成済みのテーブルにも追加・変更が出来ます。

主キーの指定 <PRIMARY KEY>

主キーとは、ベーステーブルの各行を一意に識別するための”1つ以上の列のグループ”のことです。
主キーは NULL を持たず、一意であることを保障するために制約が適用されます。
ちなみに、ベーステーブルとは他のテーブルから抽出されたデータが含まれないテーブルのことです。

/* 主キーの指定 */
CREATE TABLE 受注表
(
   受注番号     INTEGER PRIMARY KEY ,
   得意先コード CHAR(5) ,
   商品コード   CHAR(4) ,
   受注個数     INTEGER
) ;

主キーを2つの列に指定することも出来る。

/* 主キーの指定 */
CREATE TABLE 価格表
(
   販売店コード CHAR(4) ,
   商品コード   CHAR(4) ,
   価格         INTEGER ,
   PRIMARY KEY(販売店コード , 商品コード)
) ;

一意性制約 <UNIQUE>

テーブルの作成時に列に UNIQUE 列制約を設定すると、データベースはすでに他の行の同じ列に存在する値の設定を拒否することができます。

UNIQUE 制約は、次の点で PRIMARY KEY 制約と異なります。

  • PRIMARY KEY 制約は、あるテーブルの 1つの列または複数の列に1度だけ使用できるが、UNIQUE 制約は何度でも使用できる。
  • PRIMARY KEY 制約を持つ列には NULL が含まれないが、UNIQUE 制約を持つ列には NULL が含まれる可能性がある。
/* UNIQUE制約の指定 */
CREATE TABLE 商品表
(
   商品コード  INTEGER PRIMARY KEY ,
   商品名      CHAR(16) UNIQUE,
   商品単価    INTEGER
) ;

また、UNIQUE 制約はテーブル制約とすることで、複数の列の組合せの一意性を保つことができます。

/* UNIQUE制約の指定 */
CREATE TABLE 受注表
(
   受注番号     INTEGER PRIMARY KEY ,
   得意先コード CHAR(5) ,
   商品コード   CHAR(4) ,
   受注個数     INTEGER ,
   納品日       CHAR(8) ,
   UNIQUE (得意先コード, 納品日)
) ;

NULL を締め出す制約<NOT NULL>

CREATE TABLE 文では、NOT NULL 制約を使用することで、列に NULL が許可されるのを防ぐことができます。
この制約は列に対してのみ使用できます。

/* NOT NULL制約の指定 */
CREATE TABLE 商品表
(
   商品コード  INTEGER PRIMARY KEY ,
   商品名      CHAR(16) UNIQUE NOT NULL ,
   商品単価    INTEGER
) ;

列値の確認<CHECK>

入力したデータが正しい範囲を逸脱していないか、正しいフォーマットになっているかなど、テーブルに入力するデータを必要に応じて制約を適用します。

CHECK 制約を利用すれば、テーブルに入力されるデータが受理されるにあたって、満たしていなければならない条件を定義できるようになります。

/* CHECK制約による入力値の制限 */
CREATE TABLE 受注表
(
   受注番号     INTEGER PRIMARY KEY ,
   得意先コード CHAR(5) ,
   商品コード   CHAR(4) ,
   受注個数     INTEGER CHECK(受注個数 >= 10)
) ;

CHECK 制約はテーブル制約として利用することもできます。

/* CHECK制約による入力値の制限 */
CREATE TABLE 受注表
(
   受注番号     INTEGER PRIMARY KEY ,
   得意先コード CHAR(5) ,
   商品コード   CHAR(4) ,
   受注個数     INTEGER ,
   CHECK(受注個数 >= 10 OR 商品コード = 0003)
) ;

制約の名前付けと削除

制約には名前を付けることが可能です。
名前を付けることにより、制約を破棄することができるようになります。

/* 制約の名前付け */
CREATE TABLE 受注表
(
   受注番号     INTEGER PRIMARY KEY ,
   得意先コード CHAR(5) ,
   商品コード   CHAR(4) ,
   受注個数     INTEGER ,
   CONSTRAINT ENTERCHECK
   CHECK(受注個数 >= 10 OR 商品コード = 0003)
) ;

上の例では制約の名前は ENTERCHECK になります。
この制約を受注表から削除するには、ALTER TABLE 文を用います。

/* 制約の名前を削除 */
ALTER TABLE 受注表 DROP CONSTRAINT ENTERCHECK ;

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です


+ 7 = 10

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>