isql コマンドライン・インタフェースから Virtuoso を使ってみる
【概要】
OpenLink Virtuosoは,リレーショナル,グラフ,文書などの多様なデータモデルを一つのシステムで管理できるデータベース管理システム(マルチモデルデータベース)である.異なる形式のデータソースを一つに見せる仮想的な統合(データ仮想化)を実現する.HTTP,ODBC,JDBCといった標準的な接続方式に対応し,SQLによるリレーショナルデータの操作と,SPARQLによるWebデータの検索が可能である.
このページでは,isql のコマンドライン・インタフェースを使った基本的なデータベース操作を,具体的な手順とともに説明する.テーブルの定義から,データの挿入・問い合わせ・更新・削除,一貫性制約の確認までを順に扱う.
公式ページ: https://virtuoso.openlinksw.com/
【目次】
- このWebページの学習目標と内容
- 環境設定と準備作業
- isqlの起動と基本操作
- SQLを用いたテーブル定義と一貫性制約の実装
- テーブルへのデータ挿入手順
- 一貫性制約違反の検証
- SQL問い合わせの実行と結果確認
【関連する外部ページ】
Virtuosoの機能と使い方の詳細は,公式ドキュメントを参照.isql(Interactive SQL)の詳細は,Interactive SQL Utilityを参照.
【サイト内の関連情報】
- データベースのページ
1. このWebページの学習目標と内容
- 既存データベースをisqlで操作する方法を身につける.
- テーブル定義と一貫性制約を実装できるようになる.
リレーショナル・スキーマ (relational schema): order_records(id, year, month, day, customer_name, product_name, unit_price, qty)
SQL文:
create table order_records ( id INTEGER PRIMARY KEY not null, year INTEGER not null CHECK ( year > 2008 ), month INTEGER not null CHECK ( month >= 1 AND month <= 12 ), day INTEGER not null CHECK ( day >= 1 AND day <= 31 ), customer_name VARCHAR not null, product_name VARCHAR not null, unit_price REAL not null CHECK ( unit_price > 0 ), qty INTEGER not null DEFAULT 1 CHECK ( qty > 0 ), created_at DATETIME not null, updated_at DATETIME, CHECK ( ( unit_price * qty ) < 200000 ) ); - テーブルへデータを挿入する.
insert into order_records values( 1, 2022, 10, 26, 'kaneko', 'orange A', 1.2, 10, now(), NULL ); insert into order_records (year, month, day, customer_name, product_name, unit_price, qty, created_at) values( 2022, 10, 26, 'miyamoto', 'Apple M', 2.5, 2, now() ); insert into order_records (year, month, day, customer_name, product_name, unit_price, qty, created_at) values( 2022, 10, 27, 'kaneko', 'orange B', 1.2, 8, now() ); insert into order_records (year, month, day, customer_name, product_name, unit_price, created_at) values( 2022, 10, 28, 'miyamoto', 'Apple L', 3, now() );「now()」は,データベースの現在時刻を返すVirtuosoの組み込み関数である.
- 一貫性制約の動作を確認する.
- SQL問い合わせを実行する.
SELECT * FROM order_records; SELECT * FROM order_records WHERE day = 26; SELECT * FROM order_records WHERE customer_name = 'kaneko'; SELECT * FROM order_records WHERE unit_price > 2; - データを更新する.
「UPDATE ... SET ...」は,テーブル内のデータを更新するSQL構文である.
UPDATE order_records SET qty=12, updated_at=now() WHERE id = 1; - データを削除する.
「DELETE FROM ... WHERE ...」は,条件に一致する行を削除するSQL構文である.
DELETE FROM order_records WHERE id = 2;
2. 環境設定と準備作業
Virtuosoのインストール手順(Ubuntu環境)
インストールするには,ターミナルで次のコマンドを実行する.
sudo apt -y install virtuoso-opensource
Virtuosoの詳しい使い方と機能は,公式ドキュメントを参照.
3. isqlの起動と基本操作
isqlの起動手順
isqlの機能と使い方の詳細は,公式ドキュメントを参照.次のコマンドで起動する(isql-vt はVirtuoso用のisqlクライアントである).
isql-vt
ヘルプ機能の利用方法
「help;」を実行すると,isqlで使えるコマンドの一覧が表示される.
isqlの終了手順
「exit;」を実行すると,isqlを終了する.
4. SQLを用いたテーブル定義と一貫性制約の実装
SQLを使い,order_recordsテーブルの構造と一貫性制約を定義する.
リレーショナル・スキーマ (relational schema): order_records(id, year, month, day, customer_name, product_name, unit_price, qty)
- 次のSQL文を実行し,テーブルを作成する.
create table order_records ( id INTEGER PRIMARY KEY not null, year INTEGER not null CHECK ( year > 2008 ), month INTEGER not null CHECK ( month >= 1 AND month <= 12 ), day INTEGER not null CHECK ( day >= 1 AND day <= 31 ), customer_name VARCHAR not null, product_name VARCHAR not null, unit_price REAL not null CHECK ( unit_price > 0 ), qty INTEGER not null DEFAULT 1 CHECK ( qty > 0 ), created_at DATETIME not null, updated_at DATETIME, CHECK ( ( unit_price * qty ) < 200000 ) );
5. テーブルへのデータ挿入手順
order_recordsテーブルに具体的なデータを登録する.次の手順で進める.
- SQLコマンドの実行
「insert into ...」文でデータを挿入する.
insert into order_records values( 1, 2022, 10, 26, 'kaneko', 'orange A', 1.2, 10, now(), NULL ); insert into order_records values( 2, 2022, 10, 26, 'miyamoto', 'Apple M', 2.5, 2, now(), NULL ); insert into order_records values( 3, 2022, 10, 27, 'kaneko', 'orange B', 1.2, 8, now(), NULL ); insert into order_records values( 4, 2022, 10, 28, 'miyamoto', 'Apple L', 3, 1, now(), NULL );now()関数を使うと,システムの現在日時がDATETIME型(YYYY-MM-DD HH:MM:SS形式)で設定される.
トランザクション制御には,次のコマンドを使える.- set autocommit off;
- commit work;
- rollback work;
- データ挿入結果の確認
SELECT * FROM order_records;
* すべての属性値を,テーブル定義の順に指定する方式.
insert into order_records values( 1, 2022, 10, 26, 'kaneko', 'orange A', 1.2, 10, now(), NULL );
* 挿入する属性を明示的に指定する方式.
この方式では,指定しなかった属性には,テーブル定義時のデフォルト値が適用される.
insert into order_records (id, year, month, day, customer_name, product_name, unit_price, qty, created_at) values( 2, 2022, 10, 26, 'miyamoto', 'Apple M', 2.5, 2, now() );
6. 一貫性制約違反の検証
データベース管理システムは,定義された一貫性制約を監視し,違反する操作を検出して拒否する.以下に検証例を示す.
主キー制約の検証(PRIMARY KEY)
insert into order_records values( 3, 2022, 10, 30, 'kaneko', 'banana', 10, 3, now(), NULL );
* 属性idの値3はすでに存在するため,主キー制約「PRIMARY KEY」に違反し,挿入は拒否される.
非NULL制約の検証(not null)
insert into order_records values( 3, 2022, 10, 30, NULL, 'melon', 10, 3, now(), NULL );
* 属性customer_nameには非NULL制約「not null」が定義されているため,NULL値の設定は許可されない.
データ整合性制約の検証
制約違反の検証例
insert into order_records values( 6, 1009, 10, 30, 'kaneko', 'melon', 10, 3, now(), NULL );
* 年度の制約「CHECK ( year > 2008 )」に違反するため,挿入は拒否される.
複合制約違反の検証
insert into order_records values( 7, 2022, 10, 31, 'kaneko', 'strawberry', 4.6, 100000, now(), NULL );
* 総額の制約「CHECK ( ( unit_price * qty ) < 200000 )」に違反するため,挿入は拒否される.
7. SQL問い合わせの実行と結果確認
ここでは,よく使うSQL問い合わせの例を示す.より高度なSQL問い合わせは,別ページで解説している.ここでは,テーブルの内容を確認する方法に焦点を当てる.
全データの表示
SELECT * FROM order_records;