変奏現実

パソコンやMMORPGのことなどを思いつくまま・・・記載されている会社名・製品名・システム名などは、各社の商標、または登録商標です。

この画面は、簡易表示です

オートナンバー

[MySQL]ODBC接続でフィールドの番号を振り直してみる

MySQLのAutoInc属性は0かNULLを設定した時に自動的に番号を振る機能なので、バックアップ・リストアを繰り返していると、気が付けば、数値が重複していたりする。
※UNIQUE KEYにしておけばそんなことは起きない(ハズ

そんな困った時は

SET @i := 0 ;
UPDATE テーブル名 SET フィールド名 = (@i := @i + 1) ;

なSQLをphpMyAdminから叩けば良いらしいんだけど、MS-ACCESSとかEXCELの【ボタン】から、ODBCでExecuteしてみると・・・・

エラる。

;の後に文字があるせいらしい。

試しにストアードプロシージャっぽく、

“BEGIN
SET @i := 0 ;
UPDATE テーブル名 SET フィールド名 = (@i := @i + 1) ;
END”

をExecuteすると、BEGIN…. 何ソレ美味しいの?状態。

仮にストアードプロシージャを作ったとしても

CALL 採番(’テーブル名’, ‘フィールド名’);

の様に直接パラメータは書けないので、@引数を使って

SET @p1=’テーブル名’;
SET @p2=’フィールド名’;
CALL 採番(@p1, @p2);

と呼ばないといけないらしい。てか、行数増えてるし・・・(汗

@変数を使うSQLをODBCで扱うのは、土台無理なんだろうか?

正解は、

1行づつやらせれば良い。

Dim sql(1) As String
sql(0) = “SET @i := 0 ;”
sql(1) = “UPDATE テーブル名 SET フィールド名 = (@i := @i + 1) ;”);

あるいは
Dim sql() as String
sql = split(“…….”, vbCrLf)

for idx =lbound(sql) to ubound(sql)
ds.Execute(sql(idx),dbSQLPassThrough)
next

2行目の処理時間は結構長い。

安易に・・・

Dim cnt As Integer
set rst = odbcConn.OpenRecordset(テーブル名)
Do While rst.EOF = false
rst.edit()
cnt = cnt+1
rst(フィールド名) = cnt
rst.update()
rst.MoveNext
Loop

な事をしてしまうと、レコードが少なければ数秒で終わるけど、全レコードの全フィールドを読み取る事になるので、何万レコードもあったら、何時間かかるか判らない。




top