質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

2回答

1907閲覧

SQL Server 番号振り

退会済みユーザー

退会済みユーザー

総合スコア0

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2017/07/14 02:59

SQL ServerにAテーブル、BテーブルがありINSERT INTOで保存するときに連番が自動的に振り分けられるIDENTITYを使用していました。
しかし私の作っているものには思っていた動きをしてくれないので行き詰りました。

Aテーブルには、ID, 名前, 性別, があるとします。
Bテーブルには、ID, 名前, 顔写真, があるとします。

名前、性別はNOT NULLで、顔写真はNULLでも可能とします。

例で登録を3件実行すると、

Aテーブル Bテーブル

ID 名前 性別 ID 名前 顔写真(Image型)
1 山田 男 1 山田 あり
2 青木 女 2 青木 なし
3 井上 男 3 井上 あり

となってくれれば私の期待通りの動きです。

しかし色々動かしてみてテーブルを見てみると、連番のIDがばらついていて一致してくれません。

Aテーブル Bテーブル

ID 名前 性別 ID 名前 顔写真(Image型)
1 山田 男 1 山田 あり
2 青木 女 2 青木 なし
17 井上 男 4 井上 あり

になってたりしています。

IDはAテーブルとBテーブルの一致の為だけに振り当てているので連番じゃなくても一致さえしていればどんな数字でも構いません。
なにか良い方法はありますでしょうか。例えば、使われていなくて数が小さい数字から振り当ててくなど・・・

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

単に正規化の問題のような気がします。

Aテーブルには、ID, 名前, 性別, があるとします。
Bテーブルには、ID, 名前, 顔写真, があるとします。

Aテーブルが親でBテーブルが子の関係であれば、AテーブルのIDを
ベースにBテーブルにデータを投入することで処理ができます
A/B別々にデータ投入してIDを見比べてあってる・まちがってるでは
リレーションしているとは言えません。

投稿2017/07/14 03:48

yambejp

総合スコア114784

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/07/14 03:54

そのような方法があるとは知りませんでした。 親と子の関係で考えるのですね。 やり方が全然わからないので勉強してみます。 ありがとうございました。
yambejp

2017/07/14 03:58

> やり方が全然わからない データベースを扱うなら「正規化」は最低限必要な知識です。 はじめての方には感覚がなかなか馴染めないかもしれませんが ぜひ学習して、ステップアップをはかってください
guest

0

AテーブルとBテーブルの ID は、一致していることが必須なのですよね?
ということは、A テーブルの ID だけを IDENTITY として、

insert into A values (...); の後で select ident_current('A'); で最新のIDを取得、 insert into B values ({取得したID}, ...);

とすることになりますが、保証するためには B が insert されるまで A を「他のプロセスが insert しない」必要があるため、A テーブル全体を書き込み不可でロックすることになります。パフォーマンス的にどうでしょうかね。

将来のことを考えると、IDENTITY を使わずに、きちんと SEQUENCE を定義して使ったほうが良いでしょう。

余談:
なぜ B テーブルにも名前が必要なのでしょう? 正規化で考えると、B.名前は A.名前と同じものであるはずですから、2か所に保存する意味がありません。

投稿2017/07/14 03:19

tacsheaven

総合スコア13703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/07/14 03:34

ありがとうございます。SQLを触りだしてちょうど一週間でまだ全然わからない状態なのでSEQUENCEというのが何なのかもわからない状態ですが、勉強してみます。 また、Bテーブルに名前ですが、もしBテーブルに保存する顔写真のデータがなければIDもINSERTされなかったので名前を保存しました。(IDだけのINSERTの方法を知らないため、このようにしています) 例でいうと、ID = 2の青木さん。 Bテーブルに顔写真がない&名前もない。となるとINSERTされない。つまりIDもINSERTされない。 といった状態になったからです。
tacsheaven

2017/07/14 03:51

顔写真がないならば、Bテーブルにレコードがある必要がありません。それが問題になるのは、Aテーブルと B テーブルを inner join してしまっているからです。left outer join にすると、「B テーブルに一致するものがなければ、null とみなされる」形で返ってきますよ。 SQL を触って1週間だとまだそこまでたどり着いていないかもですが、join はとても重要(RDB が Relational である所以)ですから、ぜひ時間をかけてでもきちんと理解するようにしてください。
退会済みユーザー

退会済みユーザー

2017/07/14 04:09

inner joinしてます。。。left outer join にするとnullが入るなんて知りませんでした。 とても勉強になりました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問