QA@IT

SQL server expressでのテーブル結合時、エラーが発生する

4616 PV

お世話になっております。

当方、SQL server expressを使用しており、テーブル結合を行ってデータ表示をしたいと考えています。
クエリを実行したところ、「制約を有効にできませんでした。行に入力できるのは、Null以外の値、一意な値、あるいは外部キーですが、この制約の違反が一つ以上の行で発生しています」とエラーが発生します。クエリは以下です。

SELECT テーブルA.順番,テーブルA.フローID, テーブルB.タイトル FROM テーブルA INNER JOIN テーブルB ON テーブルB.フローID = テーブルA.フローID ORDER BY テーブルA.順番

テーブルデータは以下の通りです。
テーブルA      テーブルB
順番、フローID   通番、フローID、タイトル
31    20      15   15   てすと
32    2       16   16    テスト2
33     2       17   16   テスト3 
34    16      18   17   テスト4

テーブルAの最後の行を消去するとエラーはなくなります。
内部結合の時は、両テーブルを参照し値が一致する行があれば表示する、という理解だったので混乱しています。
CROSS JOINにもしてみましたが、同様のエラーが発生しました。
フローIDは両テーブルとも主キーではありません。

原因をご教授頂ければと思います。
よろしくお願いします。

回答

DBへのクエリはどのようにして実行しているのでしょうか。
.NETから実行している場合は下記のような原因で発生することもあるようです。

http://p.maya.littlestar.jp/?eid=1153077

編集 履歴 (0)
  • ありがとうございます。
    クエリは.netで実行しています。
    頂いたURLを拝見いたしました。テーブル作成後に参照元のテーブル定義を変更した場合に発生するもの、と理解してよろしいでしょうか。
    データを入れた後から主キーにIDENTITY属性を付加したことに思い至ったので、主キーの設定だけ行った真っ新なテーブルを二つ作成し、同様のクエリを実行しましたが、同様のエラーが発生しました。
    -
  • 前のスレッドの話と同様、問題のクエリはストアドにあるのでしたら、SQL Server Managenent Studio でそれを実行したらどうなりますか? -

問題があるのはSQLではなくテーブルの設定です。

テーブルAのフローIDに16があるとエラーとなるようですから、
テーブルAのフローIDが外部キー、テーブルBのフローIDが親キーという外部キー制約が設定されているのではないでしょうか。
(その状態だと「フローID 16」の親(テーブルBのデータ)が複数いることになるのでエラーとなる。)

テーブルAにフローID 16の行があっても、テーブルBのフローID 16の行が1行しかなければエラーは発生しないと思います。

外部キーの構成が正しいか見直すといいでしょう。
キー指定がただしいのであればテーブルBのフローIDはユニーク制約を設定するなどしましょう。

編集 履歴 (0)

はじめまして
かむいと申します。

.Netからのクエリ実行時のエラーということなので、
TableAdapterからの実行で、DataTableに設定する際のエラーかなと考えたのですがあってますか?

その場合、DataTableのフローIDにKey制約が入っているために
エラーになっているのではないでしょうか?

同一フローIDが取得できて問題ないのであれば、DataTableのKeyを削除するのはいかがでしょう?

現在手元に実行環境がないこともあり、的外れでしたら申し訳ありません。

編集 履歴 (0)

ご回答ありがとうございます。
 おっしゃる通り、テーブルBのフローID=16の行を一行にするとエラーは発生しなくなりました。
 ただ、恐縮なのですが、テーブル定義を見直しまして、外部キーの設定は行っていない状態であることを確認しました。
 テーブル定義を以下に示します。

CREATE TABLE [dbo].[テーブルA]
(
[順番] INT NOT NULL,
[フローID] INT NOT NULL,
PRIMARY KEY CLUSTERED ([順番] ASC)
);

CREATE TABLE [dbo].[テーブルB] (
[通番] INT IDENTITY (4, 1) NOT NULL,
[フローID] INT NOT NULL,
[大カテゴリID] INT NOT NULL,
[小カテゴリID] INT NOT NULL,
[タグID1] INT NULL,
………

テーブルBではフローのバージョン管理を行う都合上、フローID欄をユニークに設定することができません。
そのため、テーブルB.フローIDを一つにまとめてから結合するようなSQL文を考えていますが、不勉強故思いつかない状況です。

編集 履歴 (0)
  • 今ちょっと試せる環境がないのですが、今見えているその定義(Bに関しては省略している部分は使わずあとPrimaryKeyを増やすだけ)で新しいテーブル(テーブルC, テーブルD等)を作って同じ様なデータを入れてもエラーは再現しますか? -
  • お返事が遅くなってしまい、申し訳ありません。
    テーブルを新たに作成し、クエリを実行してみたところ、同様のエラーが発生しました。
    -
  • .NET以外の方法(SQL Management Studioなど)でSQLを実行した場合に問題がおきないのであれば質問にも追記しておいてください。 -
ウォッチ

この質問への回答やコメントをメールでお知らせします。