• 締切済み

主キーを別のフィールドに変更したい

Access2000のVBAで、既存のテーブル「M」の主キー「ID_1」を「ID_2」に変更したいのですが、可能でしょうか? アップデータのようなロジックを組まなくてはならないので、手順としては、、、 1)まだ「ID_1」が主キーであるかどうか判断する 2)1がTrueなら、「ID_2」が主キーに変更する 3)1がFalseなら、(「ID_2」が既に主キーであると見なし)特に何もせず終了 おそらく、indexオブジェクトあたりを使えばできると思うのですが、どうもこのあたりが複雑でわかりません。 どなたかご存知の方、ご教授いただけると幸いです。

みんなの回答

noname#182251
noname#182251
回答No.2

#1の意見に賛成ですが、何か理由があるのでしょうか? testテーブルの ID_1 フィールドをプライマリーキーにするSQL文は下記の通りです(mykey は適当に変更可) alter table test add constraint mykey primary key(ID_1) これで指定されたものは alter table test drop constraint mykey で削除できます。問題はAccess2000で直接プライマリーキーを指定していると mykey に相当する「名前」が判らないことです。その問題がなければ alter table test add constraint mykey primary key(ID_2) と、さらにエラー処理を組み合わせれば、ご要望のことはできそうです。VBAは知らないので具体的コードは判りません。

全文を見る
すると、全ての回答が全文表示されます。
noname#60992
noname#60992
回答No.1

主キーというのは、テーブルのプロパティですので、 ID2に重複がないことを確認して、変更するだけで よいのではないでしょうか? テーブルのプロパティをかえるのが怖いなら、別なテーブルを 作って、データを入れてみてはいかがでしょうか? それとも何かVBAから行いたい理由があるのでしょうか? VBAからはADOXでインデックスの指定等ができたと 思いますが、ADOX自体あまり融通が利かないので私は あまり使いません。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 主キーの変更

    次のようなテーブルが存在します。レコードはあくまで参考の値です。主キーについては必ず一意の値になるようにしています。 代理店sample1がIDを紛失し、再発行を依頼された場合や,その下の顧客店やこきゃくがIDを紛失し、再発行をする場合に既存のデータをそのまま保持したまま主キーだけを変更して関連された他のテーブルに一斉に反映させるにはどうすればよいでしょうか? ここには記載していませんが顧客店IDやこきゃくIDに関連する別テーブルが10ほど存在します。 主キーが存在するレコードと重複していないかをまずチェックしてそこから基礎となるテーブルに書き換えを行いと考えているのですが、思考がそこで止まってしまっています。 よろしければアドバイスをよろしくお願いいたします。 代理店テーブル |代理店ID(主キー) |代理店名| |        aaaaa | sample1| |        bbbbb | sample2| 顧客店テーブル |代理店ID(主キー) |顧客店ID(主キー)|顧客店名| |        aaaaa |      a-00001| ○○1店| |        aaaaa |      a-00002| ○○2店| |        bbbbb |      b-00001| △△1店| |        bbbbb |      b-00002| △△2店| 顧客テーブル |顧客店ID(主キー) |      こきゃくID(主キー)| こきゃく名| |        a-00001|    a-20071015-00001| Aさん   | |        a-00002|    a-20071015-00002| Bさん   | |         b-00001|     b-20050915-00001| Cさん   | |        b-00002|    b-20050915-00002| Dさん   |

  • Access 主キーの変更について

    調査データの集計、蓄積用のDBを制作しております。 制作しているDBは主キーに県コードが含まれています。 そのため、調査データの住所に変更があるとコードを変えなければなりません。 AccessでのDBはほぼ完成しており、今からコードの形態を変更することは避けたいです。(もともと古い独自のDBのデータを流用しています。) 現在、主キーに県コードが含まれていますが、それとは別に県コードフィールドを設けています。 ※コードの形態 (先頭の二桁又は一桁が県コード、コードは4桁又は5桁) 例   主キー 北海道 1001 東京  13199 沖縄  47001 新規のデータを入力する際に主キーを入力しているのですが VBAの知識がないので県コードは個別に入力しています。 住所が変わり県が変更になった場合主キーを変更する必要が あるのですが一対多でリレーションシップをいくつもしてあり サブフォームなども使用してます。 主のフォームで主キーを変更した場合、関連付けられたレコードの主キーも変更されるようにしたいのですが可能でしょうか?

  • MDB内既存テーブルに主キーのフィールド追加は可能か?

    DAOでMDBにアクセスするシステムなのですが、 テーブル仕様変更に伴い、既存のテーブルに新規に主キーとなるフィールドを追加します。 当テーブルはすでに主キーは複数存在しています。 現在は CreateIndex("PrimaryKey")を行ったのですが、 「既に主キーは既に存在しています」と表示されてしまい、異常終了をしてしまいます。 単にフィールド追加することは容易なのですが、主キーとなると、だめみたいです。 この場合は、どのようにすれば良いのでしょうか? 大変申し訳ございません。 ご教授よろしくお願い致します。

  • Access 主キーの解除について

    'テーブル[売上]に主キーを設定します DoCmd.RunSQL "ALTER TABLE 売上 ADD PRIMARY KEY (No);" 'テーブル[売上]の主キーを解除します DoCmd.RunSQL "DROP INDEX PRIMARYKEY ON [売上];" Access2007を使用しています。 VBAで主キーの設定・解除をするため、上記のプログラムを組みました。動かしてみると、設定はできたのですが、解除のプログラムで以下のエラーメッセージがでました。 実行時エラー'3372': テーブル'売上'にインデックス'PRIMARYKEY'が見つかりませんでした。 見つからないと出たので売上テーブルを開き確認をしたところ、ちゃんと主キー設定されていました。 そこで手動で主キーの設定しなおしプログラムを動かすと、解除プログラムが動きました。 手動で設定すると動くのですが、何故プログラムで設定した主キーでは動かないのでしょうか。 ご教授のほど、よろしくお願いします。

  • 主キー、インデックスが作成できない

    お世話になります。 SQLserver2000とACCESS(フロント)で使っております。 主キーもインデックスも設定していなかったテーブルに エンタープライズマネージャから主キーを設定しようとしたのですが、保存しようとすると以下のエラーが出てしまいます。 もともと更新クエリを作成したのですが、”更新可能なクエリであることが必要です。”とエラーが出てしまい、いろいろ調べるうちに主キーを設定していないから??と思い、設定しようとしたのですがうまくいきません。。宜しくお願いします。 ■エラー内容 テーブル 'テーブル名 (ユーザー名)' - インデックス 'インデックス名' を作成できません。 ODBC エラー : [Microsoft][ODBC SQL Server Driver][SQL Server]インデックス ID 1 で重複したキーが見つかったので、CREATE UNIQUE INDEX は終了しました。もっとも重要な主キーは 'XXXX-00XXXX-00-A1 ' です。 [Microsoft][ODBC SQL Server Driver][SQL Server]制約を作成できませんでした。以前のエラーを調べてください。 [Microsoft][ODBC SQL Server Driver][SQL Server]ステートメントは終了されました。

  • Access2000 VBA(ADO)を使用して主キーの空きを探す処理

    「id」(文字型・8バイト)を主キーとした、簡単なテーブルを作成しました。 この「id」のフィールドには一応「KEY-0」~「KEY-10」まで入力されています。 (数字の部分は0,1,2,3,4,5・・・10となっています。) この主キーの空き(重複しない値)を探す処理を以下の様に作成しましたが、どうも上手いきません。 期待する主キーの空きは、「KEY-11」だと思うのですが、なぜか「KEY-10」で処理が抜けてしまいます。 ソフトウェア)Access2000 言語)VBA(ADOを使用しました。) 初歩的な事かもしれませんが、とても悩んでいます。 どなたかご教授いただけないでしょうか? 何卒、宜しくお願いします。 処理ここから Private Sub IdCheck_Click() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim i As Integer Dim TempKey as String Dim flgKey As Boolean Set cn = CurrentProject.Connection Set rs = New ADODB.Recordset rs.Open "TEST_TABLE", cn, adOpenKeyset, adLockOptimistic '各変数など初期化 TempKey = "" i = 0 flgKey = False '主キーの空きを探すまで処理を繰り返す。 Do TempKey = "KEY-" & CStr(i) rs.Find "id='" & TempKey & "'" '主キーの空きがあった場合 If rs.EOF Then '処理を終える flgKey = True '主キーの空きがない場合 Else i = i + 1 End If Loop Until flgKey = True '一応表示させて値の確認をしています。 MsgBox TempKey rs.Close Set rs = Nothing cn.Close Set cn = Nothing End Sub ここまで

  • 「主キー以外重複データ(フィールド多数)」の抽出

    タイトルのような抽出方法が必要になり、その出し方で困っています フィールドが100以上ある大きなテーブルが複数(フィールド構造は全く同じ)あり、 そのレコードを一つにまとめる為重複データを抽出し削除したいのです 条件は「主キー以外の全てのフィールドのデータが一致してる重複データ」であり、 それをどうやればAccessの機能で出せるのか悩んでいます。 最初はクエリでグループ化して出そうと思ったのですがこのフィールド数では全て グループ化はできず、 VBAで一行ずつループで処理しようにもキー以外の全フィールド一致とする検索条件のSQLのWHERE式が複雑すぎると出て処理できませんでした フィールド数が多大なテーブルで主キー以外完全一致の重複レコードをうまく抽出するにはどうすればいいのでしょうか?

  • mySQLでキー長のエラー

    var $user_details = array( 'id' => array('type' => 'string', 'null' => false, 'default' => NULL, 'length' => 36, 'key' => 'primary'), 'user_id' => array('type' => 'string', 'null' => false, 'default' => NULL, 'length' => 36), 'position' => array('type' => 'float', 'null' => false, 'default' => '1'), 'field' => array('type' => 'string', 'null' => false, 'default' => NULL, 'key' => 'index'), 'value' => array('type' => 'text', 'null' => true, 'default' => NULL), 'input' => array('type' => 'string', 'null' => false, 'default' => NULL, 'length' => 16), 'data_type' => array('type' => 'string', 'null' => false, 'default' => NULL, 'length' => 16), 'label' => array('type' => 'string', 'null' => false, 'length' => 128), 'created' => array('type' => 'datetime', 'null' => true, 'default' => NULL), 'modified' => array('type' => 'datetime', 'null' => true, 'default' => NULL), 'indexes' => array('PRIMARY' => array('column' => 'id', 'unique' => 1), 'UNIQUE_PROFILE_PROPERTY' => array('column' => array('field', 'user_id'), 'unique' => 1)) ); var $users = array( 'id' => array('type' => 'string', 'null' => false, 'default' => NULL, 'length' => 36, 'key' => 'primary'), 'username' => array('type' => 'string', 'null' => false, 'default' => NULL, 'key' => 'index'), 'slug' => array('type' => 'string', 'null' => false, 'default' => NULL), 'password' => array('type' => 'string', 'null' => true, 'default' => NULL, 'length' => 128), 'password_token' => array('type' => 'string', 'null' => true, 'default' => NULL, 'length' => 128), 'email' => array('type' => 'string', 'null' => true, 'default' => NULL, 'key' => 'index'), 'email_verified' => array('type' => 'boolean', 'null' => true, 'default' => '0'), 'email_token' => array('type' => 'string', 'null' => true, 'default' => NULL), 'email_token_expires' => array('type' => 'datetime', 'null' => true, 'default' => NULL), 'tos' => array('type' => 'boolean', 'null' => true, 'default' => '0'), 'active' => array('type' => 'boolean', 'null' => true, 'default' => '0'), 'last_login' => array('type' => 'datetime', 'null' => true, 'default' => NULL), 'last_action' => array('type' => 'datetime', 'null' => true, 'default' => NULL), 'is_admin' => array('type' => 'boolean', 'null' => true, 'default' => '0'), 'role' => array('type' => 'string', 'null' => true, 'default' => NULL), 'created' => array('type' => 'datetime', 'null' => true, 'default' => NULL), 'modified' => array('type' => 'datetime', 'null' => true, 'default' => NULL), 'indexes' => array('PRIMARY' => array('column' => 'id', 'unique' => 1), 'BY_USERNAME' => array('column' => array('username'), 'unique' => 0), 'BY_EMAIL' => array('column' => array('email'), 'unique' => 0)) ); } というスキーマ定義をしたところ、 user_detailsだけ、 user_details: SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes というエラーが出てしまいます。キー長がオーバーしているらしいのですが、具体的にどこをどう修正すれば767バイト以下になるのかわかりません。 色々試して見たのですがわかりませんでした。 ご教示頂ければ幸いです。よろしくおねがいいたします。

    • ベストアンサー
    • MySQL
  • ACCESS2000の主キー重複について

    いつもお世話になっています。 早速ですが、お教えください テーブル名:AMaster フィールド名:B があります。 「B」は主キーになっていまして、ユーザーが任意に数字をいれることになります。 主キーになっていますので基本的には重複しないのですがユーザーの押し間違いなどによって重複してしまった場合 [Microsoft][ODBC Microsoft Access Driver] インデックス、主キー、またはリレーションシップで値が重複しているので、テーブルを変更できませんでした。重複する値のあるフィールドの値を変更するか、インデックスを削除してください。または重複する値を使用できるように再定義してください。 といったエラーメッセージが出ます。これは出ても構わないのですがツールバーの「戻る」でしか今後の操作ができなくなってしまうので(ユーザーはPC超初心者)何らかの形でエラーメッセージとともに任意のページへ戻れるようにしたいと考えています。 つきましては、「B」フィールドにあるデータとこれから入力される数値が重複していたら・・・という記述をお教えいただきたいと思います。 ASPにて作成していますのでそれに対応した記述ですとありがたいです。 過去のログに似たようなものがありましたがこちらを参照してもボクにはわかりませんでした。 http://okweb.jp/kotaeru.php3?q=357614 ボクも何分初心者なのでわからないことだらけですがよろしくお願いします。

  • Accessのテーブルへ複数の主キーを設定するには

    Access2003のVBAを使って開発していますが、 サーバーから取得したローカルテーブルに 複数の主キーを設定したいのですが、うまくいきません。 ソースは下記です。 Dim db As Database Dim Tbdef As TableDef Dim Fld As Field Dim Idx As Index Set db = CurrentDb Set Tbdef = db.TableDefs("TWorker") Set Idx = Tbdef.CreateIndex("INDEX_WORKER") Idx.Fields.Applend Idx.CreateField("作業者番号") Idx.Fields.Applend Idx.CreateField("登録日時") ★ Idx.Primary = True Tbdef.Indexes.Append Idx ★行で落ちるというか、終了してしまいます。 1つの主キーなら設定できるのですが、 複数設定する方法をご教授いただけますか。 よろしくお願いします。