Db2-constraints

提供:Dev Guides
移動先:案内検索

DB2-制約

この章では、データベースのさまざまな制約について説明します。

前書き

データベースの整合性を強化するために、制約と呼ばれる一連のルールが定義されています。 制約は、列の値を許可または禁止します。

リアルタイムデータベースアクティビティでは、特定の制限付きでデータを追加する必要があります。 たとえば、販売データベースでは、sales-idまたはtransaction-idは一意である必要があります。 制約タイプは次のとおりです。

  • NOT NULL
  • ユニーク
  • 主キー
  • 外部キー
  • チェック
  • 情報提供

制約はテーブルにのみ関連付けられます。 特定のテーブルのみに適用されます。 それらは、テーブルの作成時に定義され、テーブルに適用されます。

各制約の説明:

NOT NULL

テーブル内の1つ以上の列からのNULL値を禁止するルールです。

構文:

db2 create table <table_name>(col_name col_type not null,..)

:[4つの列(id、itemname、qty、price)を含む販売テーブルを作成し、すべての列に「not null」制約を追加して、テーブルにnullセルが形成されないようにします。

db2 create table shopper.sales(id bigint not null, itemname
varchar(40) not null, qty int not null,price double not null)

テーブルへのNOT NULL値の挿入

以下に示すように、テーブルに値を挿入できます。

例: [ERRORoneous Query]

db2 insert into shopper.sales(id,itemname,qty)
values(1,'raagi',12)

出力: [正しいクエリ]

DB21034E  The command was processed as an SQL statement because
it was not a

valid Command Line Processor command.  During SQL processing
it returned:

SQL0407N  Assignment of a NULL value to a NOT NULL column
"TBSPACEID=5,

TABLEID=4, COLNO=3" is not allowed.  SQLSTATE=23502

例: [正しいクエリ]

db2 insert into shopper.sales(id,itemname,qty,price)
values(1,'raagi',12, 120.00)

db2 insert into shopper.sales(id,itemname,qty,price)
values(1,'raagi',12, 120.00)

出力:

DB20000I The SQL command completed successfully.

ユニークな制約

これらの制約を使用して、列の値を一意に設定できます。 このため、テーブルの作成時に一意の制約は「not null」制約で宣言されます。

構文:

db2 create table <tab_name>(<col> <col_type> not null unique, ...)

例:

db2 create table shopper.sales1(id bigint not null unique,
itemname varchar(40) not null, qty int not null,price
double not null)

テーブルへの値の挿入

  • 例:*一意のIDが1、2、3、4の4つの異なる行を挿入する場合
db2 insert into shopper.sales1(id, itemname, qty, price)
values(1, 'sweet', 100, 89)

db2 insert into shopper.sales1(id, itemname, qty, price)
values(2, 'choco', 50, 60)

db2 insert into shopper.sales1(id, itemname, qty, price)
values(3, 'butter', 30, 40)

db2 insert into shopper.sales1(id, itemname, qty, price)
values(4, 'milk', 1000, 12)

例:「id」値が3の新しい行を挿入するには

db2 insert into shopper.sales1(id, itemname, qty, price)
values(3, 'cheese', 60, 80)

出力:既存のID値を持つ新しい行を挿入しようとすると、次の結果が表示されます。

DB21034E  The command was processed as an SQL statement
because it was not a

valid Command Line Processor command.  During
SQL processing it returned:

SQL0803N  One or more values in the INSERT statement,
UPDATE statement, or foreign key update caused by a
DELETE statement are not valid because the primary key,
unique constraint or unique index identified by "1" constrains
table "SHOPPER.SALES1" from having duplicate values for the
index key. SQLSTATE=23505

主キー

一意の制約と同様に、「主キー」と「外部キー」の制約を使用して、複数のテーブル間の関係を宣言できます。

構文:

db2 create table <tab_name>( ,.., primary
key ())

:「sid」を主キーとして「salesboys」テーブルを作成するには

db2 create table shopper.salesboys(sid int not null, name
varchar(40) not null, salary double not null, constraint
pk_boy_id primary key (sid))

外部キー

外部キーは、別のテーブルの行の少なくとも1つの主キーと一致するために必要なテーブル内の列のセットです。 これは、参照制約または参照整合性制約です。 これは、1つ以上のテーブルの複数の列の値に関する論理規則です。 テーブル間の必要な関係を有効にします。

前に、「shopper.salesboys」という名前のテーブルを作成しました。 このテーブルでは、主キーは「sid」です。 ここで、「従業員」という名前の異なるスキーマと「salesboys」という名前のテーブルを持つ営業少年の個人情報を含む新しいテーブルを作成しています。 この場合、「sid」は外部キーです。

構文:

db2 create table <tab_name>(<col> <col_type>,constraint
<const_name> foreign key (<col_name>)
                  reference <ref_table> (<ref_col>)

:[外部キー列「sid」を持つ「salesboys」という名前のテーブルを作成するには]

db2 create table employee.salesboys(
            sid int,
            name varchar(30) not null,
            phone int not null,
            constraint fk_boy_id
            foreign key (sid)
            references shopper.salesboys (sid)
             on delete restrict
                       )

:[主キーテーブル「shopper.salesboys」への値の挿入]

db2 insert into shopper.salesboys values(100,'raju',20000.00),
(101,'kiran',15000.00),
(102,'radha',10000.00),
(103,'wali',20000.00),
(104,'rayan',15000.00)

:[値を外部キーテーブル「employee.salesboys」に挿入する[エラーなし]]

db2 insert into employee.salesboys values(100,'raju',98998976),
(101,'kiran',98911176),
(102,'radha',943245176),
(103,'wali',89857330),
(104,'rayan',89851130)

「shopper.salesboys」テーブルに保存されていない未知の番号を入力した場合、SQLエラーが表示されます。

:[エラー実行]

db2 insert into employee.salesboys values(105,'rayan',89851130)

出力:

DB21034E  The command was processed as an SQL statement because it
was not a valid Command Line Processor command.  During SQL
processing it returned: SQL0530N  The insert or update value of
the FOREIGN KEY "EMPLOYEE.SALESBOYS.FK_BOY_ID" is not equal to any
value of the parent key of the parent table.  SQLSTATE=23503

制約の確認

この制約を使用して、テーブルの特定の列に条件付き制限を追加する必要があります。

構文:

db2 create table
 (
  primary key (),
  constraint  check (condition or condition)
 )

:[制約値を持つemp1テーブルを作成するには]

db2 create table empl
 (id           smallint not null,
  name         varchar(9),
  dept         smallint check (dept between 10 and 100),
  job          char(5)  check (job in ('sales', 'mgr', 'clerk')),
  hiredate     date,
  salary       decimal(7,2),
  comm         decimal(7,2),
  primary key (id),
  constraint yearsal check (year(hiredate) > 1986 or salary > 40500)
 )

値を挿入する

以下に示すように、テーブルに値を挿入できます。

db2 insert into empl values (1,'lee', 15, 'mgr', '1985-01-01' ,
40000.00, 1000.00)

制約の削除

さまざまな制約を削除するための構文を見てみましょう。

UNIQUE制約の削除

構文:

db2 alter table <tab_name> drop unique <const_name>

主キーの削除

構文:

db2 alter table <tab_name> drop primary key

チェック制約の削除

構文:

db2 alter table <tab_name> drop check <check_const_name>

外部キーのドロップ

構文:

db2 alter table <tab_name> drop foreigh key <foreign_key_name>