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