 |
dbld実行時「キーがない」というエラーになる。 |
|
dbld を行なっているテーブルに、プライマリキーがないためにこのエラーとなっています。
[1] |
-nオプションを使用して、挿入のみのモードにて
dbld を実行して下さい。
この方法では、テーブルにキーがなくても実行できます。 |
|
[2] |
テーブルにプライマリキーがない状態で
dbld を行なうと、パフォーマンスがかなり悪くなります。
可能であれば、該当テーブルにキーを追加してから dbld を実行して下さい。
- dbld を実行する場合は明示的に -Osep_char オプションを指定して下さい。
- dbld -u オプション指定時はデータファイル各行の先頭に更新するロウIDを指定して下さい。
<< データファイルのフォーマット >>
ロウID|カラム1のデータ\|カラム2のデータ\|...\|カラムNのデータ
次に例を示します。
サンプルスキーマ ( DDL.sql )
----------------------------
create table t1 (
c1 int not null primary key,
c2 char(8));
create unique hash index h1 on t1 (c1);
commit work;
!syncdb
サンプルデータ ( DML.sql )
--------------------------
insert into t1 values ( <100,'aaa'>, <200,'bbb'>);
1 -Osep_char オプション未指定 及び -u オプション指定時にデータファイルにロウIDを記述しない場合の実行例
$ cat t1.dat
100|AAA1
200|BBB1
$ dbld -u t1 t1.dat t1.spec
ロウ ID が無効です(値を決定できません).
- ## これは -Osep_char を使用しない為のエラー。
$ SQL getd.sql ( select * from t1; )
c1| c2
-------
100|aaa
200|bbb
$ dbld -u -Osep_char='|' t1 t1.dat t1.spec
0 ロウが更新されました.
- ## データファイルにロウIDを指定しない為、更新されません。
2 正しい実行例
$ cat t1.dat
1|100|AAA1
2|200|BBB1
$ dbld -u -Osep_char='|' t1 t1.dat t1.spec
2ロウが更新されました.
$ SQL getd.sql ( select * from t1; )
c1| c2
-------
100|AAA1
200|BBB1
(注意)
ロウIDで指定した行が存在しない場合は次のエラーとなります。
dbld: ロウが存在しません.(ロウIDが無効かロウが削除されています.) (-194)
ロウIDを調べる方法としては次の方法が有ります。
(1) RHLI ufchrow() 等の検索関数 (3) SQL/select で該当行を検索して、そのトランザクションを
(4) 終了させる前に lmshow で OBJ SLCK を確認しロウID(rid)を得る。
< lmshow 実行例 (一部) >
pid program name txnum typ lock table name rid
----- ------------- ----- --- ---- -------------- ----
10760 SQL 1
6 SCH SLCK t1
OBJ SLCK t1 1
- dbld での更新 推奨方法
-u, -n オプションを指定しないで更新することを推奨します。
データファイル内の Primary Key カラム (例ではc1) のデータに該当する行が更新され、該当しない行は更新ではなく、追加となりますので、ご注意ください。
実行例を次に示します。
$ SQL getd.sql ( select * from t1; )
c1| c2
-------
100|AAA1
200|BBB1
$ cat t1.dat
100|AAA2
300|CCC2
$ dbld -Osep_char='|' t1 t1.dat t1.spec
1ロウが追加されました, 1ロウが更新されました.
SQL getd.sql ( select * from t1; )
c1| c2
-------
100|AAA2
200|BBB1
300|CCC2
|
|
|