• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:リレーションシップ更新)

リレーションシップ更新

このQ&Aのポイント
  • SQLSERVER 2005 EXPRESS EDITIONでリレーションシップのKEYが4つになると重複エラーが表示され、更新がうまくいかない問題について
  • SQLSERVER 2005 EXPRESS EDITIONでKEYが変われば自動で更新するようにリレーションシップを作成したが、KEYが4つになると重複エラーが表示される
  • ACCESSからSQLSERVERにアップサイジングした際に、リレーションシップの更新がうまくいかない問題が発生

質問者が選んだベストアンサー

  • ベストアンサー
  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.1

質問の内容からは、以下のような理解をしたのですが、 TBL1 (KEY1,KEY2,KEY3,KEY4,...) TBL2 (KEY1,KEY2,KEY3,KEY4,...) ALTER TABLE TBL2 ADD CONSTRAINT [FK1] FOREIGN KEY (KEY1,KEY2,KEY3,KEY4) REFERENCES TBL1 (KEY1,KEY2,KEY3,KEY4) ON UPDATE CASCADE 上記の状態で、TBL1のキーを更新する Expressで直接またはAccessのリンクテーブル経由でも、おっしゃるような事象が確認できなかったのですが、可能ならば再現できるサンプルを示していただけませんか。

MIURA0802
質問者

補足

ご返事有難うございます。 TBL1のKEY1を直接変更するとKEY1,KEY2,KEY3は変更されるみたいですが,KEY4が1行目のデータを引きずっているみたいです。実際のメッセージは”エラーメッセージ:制約’テーブル名_PK’のPRIMARYKEY違反。オブジェクト’テーブル名’には重複したキーを挿入できません。ステートメントは終了されました。エラーを修正して再実行するかまたは、ESCをおして変更キャンセルしてください。”とでます。 TBL1(1、2、3) TBL2(1、2、3、AAAA)(1、2、3、BBBB) とあるときにTBL1を開きKEY1の1を変更し3にするとき上記のメッセージが出ます。実際SQLを実行しているのではなくACCESSのリンクしたテーブルを開きデータを変更したときにでます。 なぜ、KEY4だとわかったかと言えばエラーがでるのでTBL2のKEYをすべて主KEYを削除しINDEXのみの指定にしたところTBL1のKEY1,KEY2,KEY3に一致するTBL2のレコードのKEY4がすべて”AAAA"になっていました。ACCESSではうまく主KEYを設定してデータを変更すれば思っているように変更されていましたので同じ様にならないかと思いまして投稿させて頂きました。うまく説明できていないかも知れませんがSQLSERVERを触ったことないのでなかなか判らなくて、ご迷惑をお掛けしますが宜しくお願いします。

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

その他の回答 (3)

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.4

あれ?CASCADEしていませんね。最初に >KEYが変われば自動で更新するようにリレーションシップを作成したのですが と書かれたのは、どこで設定をされたのでしょうか。 外部キーを右クリックして変更を選ぶと、「外部キーのリレーションシップ」の画面が開きますが、その「INSERTおよびUPDATEの設定」-「UpdateRuleの設定」は「重ねて表示」になっている必要があります。 (スクリプトでやるならば、外部キーを一旦削除して、生成したスクリプトに「ON UPDATE CASCADE」を追加して実行するのですが)

MIURA0802
質問者

お礼

ご返事有難うございました。 UPDATE CASCADEがないので色々設定を変えているとご返事頂いた場所にINSERTおよびUPDATEの設定に動作なしとあったのでここに重ねて表示を設定しスクリプトをみると前回頂いた形と同じ用になったのでテストするとうまく処理されました。テストでうまく行ったので本番のデータで同じ様にすると今度もACCESSと同じ用に更新処理されていました。SQLSERVERのことを知らないのでアップサイジングで処理すればいいものと思い今回の騒動になってしまいました。今回の丁寧なご回答有難うございました。たいへん役に立ちましたこれからもへんな投稿をするかもしれませんが宜しくお願いします。本当に有難うございました、又、貴重な時間を裂いて頂き申し訳ございませんでした。

全文を見る
すると、全ての回答が全文表示されます。
  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.3

以下のような構造で試しましたが、再現しません。 SQL ExpressはSP2あたっているみたいですし、Accessは2000でも再現しませんでした。 CREATE TABLE [dbo].[TBLA]( [KEY1] [int] NOT NULL, [KEY2] [int] NOT NULL) GO ALTER TABLE TBLA ADD CONSTRAINT [PKA] PRIMARY KEY CLUSTERED (KEY1,KEY2) GO CREATE TABLE [dbo].[TBLB]( [KEY1] [int] NOT NULL, [KEY2] [int] NOT NULL, [KEY3] [nvarchar](6) NOT NULL) GO ALTER TABLE TBLB ADD CONSTRAINT [PKB] PRIMARY KEY CLUSTERED (KEY1,KEY2,KEY3) GO CREATE TABLE [dbo].[TBLC]( [KEY1] [int] NOT NULL, [KEY2] [int] NOT NULL, [KEY3] [nvarchar](6) NOT NULL, [KEY4] [nvarchar](15) NOT NULL) GO ALTER TABLE TBLC ADD CONSTRAINT [PKC] PRIMARY KEY CLUSTERED (KEY1,KEY2,KEY3,KEY4) GO CREATE TABLE [dbo].[TBLD]( [KEY1] [int] NOT NULL, [KEY2] [int] NOT NULL, [KEY3] [nvarchar](6) NOT NULL, [KEY4] [nvarchar](15) NOT NULL, [KEY5] [nvarchar](6) NOT NULL) GO ALTER TABLE TBLD ADD CONSTRAINT [PKD] PRIMARY KEY CLUSTERED (KEY1,KEY2,KEY3,KEY4,KEY5) GO ALTER TABLE TBLB ADD CONSTRAINT [FKB] FOREIGN KEY (KEY1,KEY2) REFERENCES TBLA (KEY1,KEY2) ON UPDATE CASCADE GO ALTER TABLE TBLC ADD CONSTRAINT [FKC] FOREIGN KEY (KEY1,KEY2,KEY3) REFERENCES TBLB (KEY1,KEY2,KEY3) ON UPDATE CASCADE GO ALTER TABLE TBLD ADD CONSTRAINT [FKD] FOREIGN KEY (KEY1,KEY2,KEY3,KEY4) REFERENCES TBLC (KEY1,KEY2,KEY3,KEY4) ON UPDATE CASCADE GO こうなると、どうも外部キーがうまくかかっていないとしか思えないのですが、そこを確認していただきたいです。 外部キーを右クリックして「名前をつけてキーをスクリプト化」を選ぶと、CREATEとDROPしか選べませんが、CREATEの方のスクリプトを生成して中身が実質上のようになっているかどうか確認してみてください(WITH CHECKとかCHECK CONSTRAINTも書き出されますがそこは無視して結構です)。 なお、924012はSSAS(Analysis Service)に関するものですので、今回のとは関係ないと思います。

MIURA0802
質問者

お礼

いつも有難うございます。 外部KEYのスクリプト化でCREATEで出来たデータをとりましたが内容が違うので動かないのでしょうね。取りあえず下記に貼り付けましたので宜しくお願いします。尚、教えて頂いた部分によく似たスクリプトはテーブルを右クリックし名前を付けてスクリプト化すると表示されていました。 (TBLAの外部キー部分) 外部キーはありません。 (TBLBの外部キー部分) USE [sqltesSQL] GO ALTER TABLE [dbo].[TBLB] WITH NOCHECK ADD CONSTRAINT [TBLB_FK00] FOREIGN KEY([key1], [key2]) REFERENCES [dbo].[TBLA] ([key1], [key2]) GO ALTER TABLE [dbo].[TBLB] NOCHECK CONSTRAINT [TBLB_FK00] (TBLCの外部キー部分) USE [sqltesSQL] GO ALTER TABLE [dbo].[TBLC] WITH NOCHECK ADD CONSTRAINT [TBLC_FK00] FOREIGN KEY([key1], [key2], [key3]) REFERENCES [dbo].[TBLB] ([key1], [key2], [key3]) GO ALTER TABLE [dbo].[TBLC] NOCHECK CONSTRAINT [TBLC_FK00] (TBLDの外部キー部分) USE [sqltesSQL] GO ALTER TABLE [dbo].[TBLD] WITH NOCHECK ADD CONSTRAINT [TBLD_FK00] FOREIGN KEY([key1], [key2], [key3], [key4]) REFERENCES [dbo].[TBLC] ([key1], [key2], [key3], [key4]) GO ALTER TABLE [dbo].[TBLD] NOCHECK CONSTRAINT [TBLD_FK00]

MIURA0802
質問者

補足

毎回ご返事ありがとうございます。 職場でしか環境がないので申し訳ございませんが休み明けに確認したいと思います。又、報告させて頂きますので最後までお付き合い願います。本当にありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。
  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.2

正直な話、再現できません(再現したらDBMSとして致命的な話だと思いますが)。 1) 先に書かれたTBL1,TBL2という仮定のテーブルでも、同じ事象が起こりますか?  ・その場合のTBL1,TBL2の主キーはそれぞれ、KEY1,KEY2,KEY3とKEY1,KEY2,KEY3,KEY4ですか?  ・TBL2に掛けられている外部キーの定義を教えてください   (SQL Server Management Studio Expressはお持ちですよね?    テーブルの下にキーというフォルダがあり、その中の灰色のキーが外部キーですが、    右クリックするとスクリプトが生成できます)  ・直接以下のクエリを実行して、同じエラーが出るか教えてください。   UPDATE TBL1 SET KEY1=3 2) 最初に製品版にはパッチが出ていると書かれていましたが、その情報を今もお持ちですか? 3) AccessのバージョンとSQL Server Expressのバージョンを教えてください(9.00.xxxx.00とかオブジェクトエクスプローラに表示されるはずです)

MIURA0802
質問者

補足

ご返事遅くなり申し訳ございません。 少し前回お返事した内容に変更・追加がございまして、今回の回答頂きましてテストした結果を合わせて報告させて頂きます。実は今回のエラーを起こしたテーブルの関係が4つのテーブルからなっています。TBL-A(KEY1,KEY2)・TBL-B(KEY1,KEY2,KEY3)・TBL-C(KEY1,KEY2,KEY3,KEY4)・TBL-D(KEY1,KEY2,KEY3,KEY4,KEY5)があります。最初の質問させて頂いた分は、TBL-CとTBL-Dの関係で質問させて頂きましたが、今回テストさせて頂いて判ったのは、TBL-AのKEY1を変更しますとACCESSではすべて関係するデータ(TBL-A~D)は更新されますが、SQLSERVERの場合TBL-A,TBL-Bは変更されましたがTBL-CとTBL-Dはうまく更新されない様です。内容は TBL-A(1,2)、 TBL-B(1行目1,2,3 2行目1,2,4)、 TBL-C(1行目1,2,3,4 2行目1,2,3,5 3行目1,2,4,1)、 TBL-D(1行目1,2,3,4,AA 2行目1,2,3,4,BB 3行目1,2,3,4,CC)に設定しTBL-AのKEY1を500に変更しました。結果は TBL-A(500,2)、 TBL-B(1行目500,2,3 2行目500,2,4)、 TBL-C(1行目500,2,4,4 2行目500,2,4,5 3行目500,2,4,1)、 TBL-D(1行目500,2,4,1,AA 2行目500,2,4,1,BB 3行目500,2,4,1,CC)となりました。又、TBL-Dに4行目1,2,3,5,AA 5行目1,2,3,5,BBを入れて置くと重複したKEYは挿入できませんというメッセージが表示されます。ACCESSではうまくいく処理がSQLSERVERでは1対1の更新はうまく行きますが、複数行の1対多の場合ACCESSと処理が違うようでした。私の勘違いで最後のTBL-CとTBL-Dの関係だけを取り上げ質問しましたのでややこしくなったと思いますが宜しくご教授願います。 追伸、今回回答の返答は1-KEY1~5はすべて主KEYとしています。又、UPDATEはグレーアウトしていてCREATとDROPとDROP及びCREAT TO(R)しか触れません。定義はKEY1-INT(NULL許可しない)、KEY2-INT(NULL許可しない)、KEY3-NVARCHAR(6)(NULL許可しない)、KEY4-NVARCHAR(15)(NULL許可しない)、KEY5-NVARCHAR(6)(NULL許可しない)。2-今回のエラーとは関係ないかもしれませんが文書番号924012に4つ以上のKEYを含む・・・がありこれかと思っていました。3-ACCESSは2002のSP3です。SQLSERVERは2005 EXPRESS EDITION 9.00.3042.00です。誠に申し訳ございませんが宜しくお願い致します。

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

関連するQ&A

  • sqlserverの場合はテーブルの連結した状態では更新できないのでしょうか

    accessユーザーです sqlserver2005にアップサイジングしたあと修正をしていますが accessの場合クエリおよびsqlのprgで作成したテーブルの連結リレーショナルで更新ができていたのですが sqlserverの場合はテーブルの連結した状態では更新できないのでしょうか ご教授おねがいします

  • SQLServer2005ExpressEditionのことで

    SQLServer2005ExpressEdition(無償版)でのAccessからのアップサイジングは可能かどうかご存知のかたいらっしゃいますか? Accessのアップサイジングを考えております。どなたかお教えください。

  • Accessからのアップサイジング

    SQLServer2005ExpressEdition(無償版)でのAccessからのアップサイジングは可能かどうかご存知のかたいらっしゃいますか? アップサイジングの方法は 各ファイルをアップサイジングウィザードに従って、進めていけばいいのですよね??

  • リレーションシップについて。

    2つのテーブルをリレーションシップ設定することによって、レコードの更新は出来るのですがレコードの追加が出来ません。ODBC経由でACCESS2000へ2つのテーブルをアタッチして操作しています。 レコードの追加は出来ないのでしょうか?よろしくお願いします。 サーバ:W2000SEREVER_SP4 SQL Server 2005 Enterprise Edition クライアント:W2000PRO_SP4 ACCESS2000_SP3

  • Accessのアップサイジングウィザード

    Accessのアップサイジングウィザードを使用し、SQLServerへ テーブルとデータを移行しようと考えています。 Access2000、SQL Server 2005 Express Editionを使用して います。 アップサイジングウィザードで「既存のデータベースを使用する」 を選択すると移行できるのですが、「新しいデータベースを作成 する」を選択すると、移行できません。レポートに「Table was skipped or export failed」と表示されます。 (ログインユーザはcreate table権限があります。) アップサイジングウィザードの手順書には、、「新しいデータベース を作成する」を選択すると書いてあるので、うまくいかない理由を 知りたいと思います。 宜しくお願い致します。

  • ストアド更新履歴

    ストアドの更新履歴情報を簡単に見る方法ご存知の方、教えて下さい。 SQLServer2005を使っています。(Editionは不明 > 何処から確認するかわからなかったため。express editionではないです。)

  • エクセルのデータをアクセスのテーブルにインポート

    エクセルのデータをアクセスのテーブルにインポートしたくて、 アクセスから外部データのインポートでエクセルを指定してるのですが ************************************************************************ ワークシート インポートウィザード インデックス、主キー、またはリレーションシップで重複する値が生成されてるため、 テーブルを変更できませんでした。 重複する値のあるフィールドの値を変更するか、インデックスを削除してください。または重複する値を使用できるように再定義してください。 ************************************************************************ になってしまいます。 エクセルの列名を見ても重複していないし(COUNTIF関数で確認しました) アクセス側のウィザードでインデックスはどこのフィールドにもつけてないし、 「主キーを設定しない」もしくは「主キーを自動的に設定する」にしているのに、何をやっても上記のエラーがでます。 ググっても同じようなエラー内容が見つからないのですが、どうしたらいいでしょう? ヴァージョンはエクセルは2007、アクセスは2010です。バージョンの相違が原因でしょうか?

  • accessでのリンクテーブルの更新

    いつもお世話になっております。 AccessからSQLServerのテーブルにリンクをはっています。 このリンクテーブルをupdate文で更新したいのですが、 「更新可能なクエリであることが必要」とでています。 以前にも類似の質問をしました。 http://okwave.jp/qa/q6581636.html しかし、いったん解決したのですが、別のところで同様の現象が でてしまいました。 調べると、リンク先のSQLServerのテーブルにはキーが存在していて、 Access側からリンクするときには自動的に一意設定されてしまいます。 発行したいupdate文はこのキーとは別の項目が一意になっていないと だめな条件付けがされているのです。 リンクをはるときに、SQLServer側ですでに設定されているキーとは 違った項目を一意項目として選択する方法はあるのでしょうか? 調べてみると、まったくキーのないテーブルをリンクするときは当然、 一意な項目を選べるのですが、キーがすでにある場合はだめな ようでした。 毎度のことでお手数なのですが、どうかよろしくお願い申し上げます。

  • Accessのリレーションシップ

    Access初心者です。 Access2010でデータベースを作っていて、行き詰ってしまいました。 テーブル1にフィールドABCDEFがあって、Aに主キーが付いています。(Aはテキスト型でフィールドサイズ10です。) テーブル2にはフィールドAGHがあり、Aに主キーが付いてます。(Aはテーブル1と同じです。) テーブル3にも同じくフィールドAIJがあり、Aに主キーが付いています。(Aはテーブル1と同じです。) テーブル1のフィールドAを主テーブルとし、テーブル2・3のフィールドAにリレーションを組んでいます。 この時のリレーションシップで参照整合性と連鎖更新と連鎖削除にチェックを入れ、種類が一対一になりました。 その後、テーブル1でレコードを追加しようとすると、「テーブル'2'にリレーションシップが設定されたレコードが必要なので、レコードの追加や変更を行うことができません。」と出ます。 これを解決する方法はどうするのか、お教えお願いします。 分かりにくい説明ですいません。

  • GoogleChromeは自動更新するの?

    Android版のGoogleChromeは手動、自動で更新されるのは知っています。Win11PC版GoogleChromeの手動更新の方法は分かっていますが、タスクスケジュールにより、自動更新されるのでしょうか?更新パッチが配布されてから遅れて更新されるのだとは思いますが、教えてください。