淡々たんのメモ
Amebaでブログを始めよう!

Oracle 表制約構文、列制約構文

メルマガ おら! オラ! Oracle - どっぷり検証生活 ソートに関する検証vol1-3 どっぷり入門生活

http://www.insight-tec.com/mailmagazine/ora3/mail_back_index.html


によると、

列制約構文→createで列を定義するごとにチマチマ入れる制約

表制約構文→createの最後にガツッと複数列に対して入れる制約(単数列でもOK)


-----------------------------------------------------------------------------

上記サイトから「制約」の頁

構文
CREATE TABLE 表名
( 列名 データ型 [ CONSTRAINT 制約名 ] 制約    ←列制約
[ [ CONSTRAINT 制約名 ] 制約 ]・・・
[ ,列名 データ型 [ CONSTRAINT 制約名 ] 制約
[ [ CONSTRAINT 制約名 ] 制約 ]・・・]・・・
[ ,CONSTRAINT 制約名 制約 ]・・・ );    ←表制約

説明
制約にはエンティティ整合性制約と参照整合性制約があり、エンティティ整合性制約には主キー制約、一意キー制約、
NOT NULL制約、チェック制約がある。制約の指定には列制約構文と表制約構文がある。NOT NULL制約は列制約構文でしか指定できない。

address表を作成する。

SQL>create table address
2 (no number (3)
3 ,name varchar2 (20) not null    ←↓列制約制約
4 ,address varchar2 (50) not null
5 ,tel number (15) unique
6 ,mail varchar2 (30)
7 ,constraint primarykey_address primary key (no) );    ←表制約
列制約
PRIMARY KEY
UNIQUE
NOT NULL
CHECK (条件)

表制約
CONSTRAINT 制約名 PRIMARY KEY 列名
CONSTRAINT 制約名 UNIQUE 列名
CONSTRAINT 制約名 CHECK (条件)

説明
PRIMARY KEY PRIMARY KEY(主キー)制約は表の行を一意に識別する。主キーは一つの表に一つしか定義できないが、複数列で1つの主キーを設定することができる。 またNULL値は許可しない。
UNIQUE UNIQUE(一意キー)制約は同じ値が入ることを禁止する。またNULL値を許可し、複数行にNULL値があってもよい。
NOT NULL NOT NULL制約はNULL値が入ることを禁止する。
CHECK CHECK制約は入力値に対して条件を設定することが可能である。
列制約
REFERENCES 参照する表名(列名)

表制約
CONSTRAINT 制約名 FOREIGN KEY 列名
REFERENCES 参照する表名(列名)

説明
参照整合性制約を設定することで他の表と親子関係を持たせることができる。よって参照する列(子表)は参照される列(親表)の値しか入力できなくなる。
また参照される親表の列は主キー制約または一意キー制約が定義されていなければならない。参照する列はNULL値を許可する。

Oracle SQL*Plusコマンド(BREAK, COMPUTE)

1.BREAK ON <カラム名>
<カラム名>で2つ目以降の重複値を省略する

例)
BREAK ON DEPARTMENT_ID;

SELECT DEPARTMENT_ID, LAST_NAME, SALARY
FROM EMP_DETAILS_VIEW
WHERE SALARY > 12000
ORDER BY DEPARTMENT_ID;

結果

DEPARTMENT_ID LAST_NAME SALARY
------------- ------------------------- ----------
20 Hartstein 13000
80 Russell 14000
Partners 13500
90 King 24000
Kochhar 17000
De Haan 17000

2.BREAK ON <カラム名> SKIP n

<カラム名>の値がかわるごとにn行の空行を挿入する。
BREAK ON <カラム名> SKIP PAGE 
で、<カラム名>の値がかわるごとに改ページする。

3.COMPUTE
Breakで指定したカラムに対して以下の計算ができる。

計算機能名 内容
SUM
<カラム名>の計
MINIMUM
<カラム名>の最小値
MAXIMUM
<カラム名>の最大値
AVG
<カラム名>の平均値
STD
<カラム名>の標準偏差値
VARIANCE
<カラム名>の分散値
COUNT
<カラム名>のNULL以外の行数
NUMBER
<カラム名>の行数
文法:
BREAK ON <カラム名>
COMPUTE <計算機能名> OF <カラム名(スペース区切りで複数指定可)> ON <カラム名>

PostgreSQLのチューニング

http://allabout.co.jp/internet/database/closeup/CU20040730A/


PostgreSQLのチューニング

PostgreSQLは最適なパフォーマンスが出るように自動的に調整されるため、特別なチューニングテクニックは必須ではありませんが、最大限にパフォーマンスを引き出したい場合にはpostgresql.confで指定している値を調整することによりチューニングが可能です。また、PostgreSQLのパフォーマンス向上のためには定期的にVACUUMコマンドを実行することをお奨めします。

■VACUUMコマンドを実行する
VACUUMコマンドはPostgreSQLデータベースの掃除と解析をおこなうコマンドです。
定期的にVACUUMコマンドを実行するとデータベースの問い合わせのパフォーマンスが向上します。
VACUUMコマンドによる処理はテーブルが大きい場合は時間がかかりますので、あまりアクセスのない時間帯におこなうとよいでしょう。

VACUUMコマンドの文法

vacuumdb [connection-options...] [[-d] dbname] [--full | -f] [--verbose | -v] [--analyze | -z] [--table 'table [( column [,...] )]']

VACUUMコマンドの実行例
testというデータベースを掃除するには、下記のようにコマンドを実行します。

$ vacuumdb test

実行後、下記のメッセージが戻ればVACUUM処理が完了しています。
VACUUM

■共有バッファを増やす場合
共有バッファはデータベースをアクセスする際のキャッシュとして使われます。
PostgreSQLを動かすサーバーの搭載メモリに余裕のあるシステムでは、メモリ内に全てのデータベースを展開するとパフォーマンスが向上します。各バッファは8Kバイトですので「共有バッファ」は次の計算で求められます

「共有バッファ」= ((空きメモリの合計) と (データベースサイズ + 512K) の少ない方)) / 8192

「共有バッファ」を増やす場合はpostgresql.conf内の「shared_buffers」で指定する値を増やします。

例)
shared_buffers = 1024

■PostgreSQLへの接続数を増やす場合
PostgreSQLの同時接続ユーザー数の上限はpostgresql.conf内の「max_connections」で指定します。
同時接続ユーザー数を増やした場合は「同時接続ユーザー数 * 2」以上に共有メモリを増やしてください。

例)
max_connections = 64

■ソートバッファの値を増やす場合
ソート処理はSQLのORDER BYを指定した場合だけでなく、テーブルの結合の際にもおこなわれますので、ソートバッファを大きくすることでパフォーマンスの向上が期待できます。
ソートバッファの値を増やす場合はpostgresql.conf内の「sort_mem」で指定する値を増やします。

例)
sort_mem = 4096

■キャッシュサイズを増やす場合
キャッシュサイズ値で共有バッファが割り当てられたときに利用できるメモリの量を設定します。
キャッシュサイズを増やす場合はpostgresql.conf内の「effective_cache_size」でキャッシュサイズを指定している値を増やします。

例)
effective_cache_size = 1000

■トランザクションログ
「トランザクションログが無くなっている(running out of transaction logs)」というメッセージが出力される場合はpostgresql.conf内の「al_files」と「wal_ buffers」で指定している値を増やします。

例)
wal_buffers = 8
wal_files = 4

TomcatをNTサービスとして起動時、JVMに起動オプションを渡す方法

ショートカットから起動するときはリンク先に記述すればいいが、サービスのときはレジストリに登録しなければならない。


 1) レジストリ HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesApache Tomcat 4.1Parameterを開く。
 2) 文字列型の項目"JVM Option Number x(xは現在の最大数+1)"を作り、パラメータを書く。例:Duser.dir="C:\CurrentPath"
 3) 既存の項目"JVM Option Count"の要素数を1増やす
 4) レジストリエディタを閉じ、Tomcatサービスを再起動する。

スキーマ作成・削除 (oracle)

スキーマ=ユーザ

http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/sq_kj02.htm


■スキーマ作成

・スキーマ(schema) は、ユーザを作成すると自動的に作られる。
(ユーザ追加、スキーマ生成)

create user testscm
identified by testpw
default tablespace USER_DATA
temporary tablespace TEMPORARY_DATA
quota unlimited on USER_DATA
;

・スキーマ(schema) の容量を限定することもできる。

create user testscm
identified by testpw
default tablespace USER_DATA
temporary tablespace TEMPORARY_DATA
quota 10M on USER_DATA
;

■スキーマ削除

・スキーマ(schema) は、ユーザを削除することで行う。

drop user testscm;

・cascade を指定すると、user が所有していたオブジェクトも削除される。

drop user testscm cascade;

TomcatでExcelファイルがまともに開けないバグ


http://hp.vector.co.jp/authors/VA000137/tomcat-missing-header-bug.html

Tomcat IEでExcelファイルがまともに開けないバグ
対象バージョン:
4.1.29、5.0.16、5.0.18
現象:
IEでExcelファイルへのリンクをクリックすると文字化けしたテキスト(Excelファイルの中身)が表示されてしまい、Excelで開けない。
原因:
HTTPヘッダが不正なため。
Tomcat 4.1.27までは、Excelファイルへのリンクをクリックした場合、HTTPヘッダにContent-Type: text/plainが返されていた。(IEはこの場合、拡張子を見てExcelを起動するものと思われる)
が、4.1.29以降、Content-Type自体が返されない。欠落している。(IEはこの場合、Tomcatからの正体不明の垂れ流しデータをテキストとして表示するものと思われる)
回避方法:
web.xmlのmime-mappingにExcelを追加する。


<mime-mapping>
<extension>xls</extension>
<mime-type>application/vnd.ms-excel</mime-type>
</mime-mapping>

Bugzilla Bug:
#25729(2003/12/23)
備考・メモ:
この件、Excelだけの話ではないので、Apacheのようなちゃんとしたソフトを参考にmime-mappingを見直した方がいいかも。

--------------------------------------------------------------------------------

参考: web.xmlリファレンス
http://www.sk-jp.com/java/servlet/webxml.html#h48

<mime-mapping>

静的コンテンツがリクエストされたときに、ファイルの拡張子に応じて返送する Content-Typeを決定したい場合に指定します。
ここで定義されていない拡張子のファイルがリクエストされた場合は、 (Tomcatでは)レスポンスのContent-Typeが指定されません。 これは望ましくありませんので、Web アプリケーション内で公開するファイルの拡張子に応じた <mime-mapping>要素はきちんと定義すべきでしょう(*)。
なお、いくつかの拡張子については Servlet コンテナのデフォルトマッピングとして定義されており、Tomcatであれば conf/web.xml に記述されている内容がそれに相当します。

<extension>

ファイルの拡張子

<mime-type>

Content-Type:ヘッダに記述されるMIMEタイプ(例:text/html)

例:Webアプリケーション内にPDFを配置したい場合

<mime-mapping>
  <extension>pdf</extension>
  <mime-type>application/pdf</mime-type>
</mime-mapping>

<mime-type>要素に指定できるMIMEタイプは、 http://www.isi.edu/in-notes/iana/assignments/media-types/ に定義されています。
# IEはレスポンスのContent-Typeに関らず、 返された文書をスキャンして適当に処理してしまう場合があって 困ったりするんですが。


シリアル・create db/user・一覧等

順序値の生成

以下で $DB は Perl の DBD::xxx での操作です.

DB key note
mysql キーワード AUTO_INCREMENT
準備 CREATE TABLE user_info ( userid INT NOT NULL PRIMARY KEY AUTO_INCREMENT, ... )
生成 レコードを直接追加. AUTO_INCREMENT カラムを指定しないもしくはnullを 挿入すると自動的に連番が設定される.
値の取得 SELECT last_insert_id(); $DB->{last_insertid}
備考 -
Oracle キーワード SEQUENCE
準備 CREATE SEQUENCE user_info_userid_seq;
生成 SELECT user_info_userid_seq.nextval FROM dual;
値の取得 SELECT user_info_userid_seq.currval FROM dual;
備考 先に nextval のみ行って, 取得した値を INSERT するか, nextval を INSERT して必要であれば currval を取り出すかで使う.
PostgreSQL キーワード SEQUENCE, (SERIAL型)
準備 CREATE SEQUENCE user_info_userid_seq;
生成 SELECT nextval('user_info_userid_seq');
値の取得 SELECT currval('user_info_userid_seq');
備考 使い方はOracleと同じ.
SQLite2 キーワード INTEGER NOT NULL PRIMARY KEY
準備 CREATE TABLE user_info ( userid INTEGER NOT NULL PRIMARY KEY ...
生成 INSERT INTO userid VALUES (null)
値の取得 SELECT last_insert_rowid(); $DB->func('last_insert_rowid')
備考 基本的にmysqlと同様. 但し INT ではだめ. INTEGER のみ.

準備(DB作成~ユーザ作成)

DB key note
mysql キーワード CREATE DATABASE,GRANT
DB作成 CREATE DATABASE mydata
権限付与 GRANT ALL ON mydata.* TO user@localhost IDENTIFIED BY 'pass';
備考 CREATE USER はない. いきなり GRANT だけでOK.
Oracle キーワード CREATE USER
ユーザ作成 CREATE USER xxx IDENTIFIED BY yyy;
権限付与 GRANT CONNECT,RESOURCE,CREATE SESSION TO xxx;
備考 パスワード部分にクオートいらない.
PostgreSQL キーワード createuser(1), createdb(1)
DB作成 $ createdb mydata
作成 $ createuser xxx;
備考 -
SQLite2 キーワード sqlite
作成 $ sqlite filename.sqlitedb でプロンプト出して DDL 実行すればファイルも作成される.

その他

目的 DB note
スキーマ(名前空間)変更 mysql use mydata
Oracle ALTER SESSION SET CURRENT_SCHEMA = mydata
ツール(CUI) mysql mysql
Oracle sqlplus
PostgreSQL psql
SQLite2 sqlite
InterBase isql
名前空間一覧 mysql show databases
Oracle ?
PostgreSQL $ psql -l; psql> \l
SQLite2 .databases
テーブル一覧 mysql show tables
Oracle SELECT TNAME FROM TAB; SELECT TABLE_NAME FROM USER_TABLES;
PostgreSQL \dt
SQLite2 .tables
ユーザ一覧 Oracle SELECT USERNAME FROM ALL_USERS