[解決済み] 外部キーから非主要キーへ
2022-04-23 11:38:13
質問
データを保持するテーブルがあり、それらの行の1つは別のテーブルに存在する必要があります。そこで、参照整合性を維持するために外部キーが必要です。
CREATE TABLE table1
(
ID INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
AnotherID INT NOT NULL,
SomeData VARCHAR(100) NOT NULL
)
CREATE TABLE table2
(
ID INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
AnotherID INT NOT NULL,
MoreData VARCHAR(30) NOT NULL,
CONSTRAINT fk_table2_table1 FOREIGN KEY (AnotherID) REFERENCES table1 (AnotherID)
)
しかし、ご覧の通り、外部キーとしたテーブルでは、カラムがPKではありません。この外部キーを作成する方法、あるいはこの参照整合性を維持するためのより良い方法はありますか?
解決方法は?
プライマリーキーでないカラムに外部キーを作成する場合は、一意制約を持つカラムでなければなりません(MUST)。
から 書籍オンライン :
FOREIGN KEY 制約は、PRIMARY KEY 制約にのみリンクさせる必要はありません。 他のテーブルの KEY 制約を参照するように定義することもできます。 他のテーブルのUNIQUE制約のカラム。
ですから、あなたの場合、もしあなたが
AnotherID
一意であれば許可されます。一意制約をかけられないとなると、運が悪いとしか言いようがありませんが、これは本当によく考えればわかることです。
しかし、前述のように、候補キーとして完全に良い主キーがある場合は、それを使用するのはどうでしょうか?
関連
-
[解決済み] SQLサーバーでNULL = NULLがfalseに評価される理由
-
[解決済み] SQL Server - 挿入された行のIDを取得するための最良の方法は?
-
[解決済み] T-SQLを使用して外部キー制約を一時的に無効にするにはどうすればよいですか?
-
[解決済み] SQL Serverで、指定したテーブルを参照しているすべての外部キーを一覧表示するにはどうすればよいですか?
-
[解決済み] 項目xにアクセスできるように文字列を分割するにはどうすればよいですか?
-
[解決済み] 複数の列に対してSELECT DISTINCTする方法(またはできる方法)は?
-
[解決済み] SQLサーバーで行を列に効率的に変換する
-
[解決済み] T-SQL文の接頭辞Nの意味と使うべきタイミングは?
-
[解決済み] Selectステートメントで特定のフィールドの重複を検索する
-
[解決済み] 制約の有効化に失敗しました。1つ以上の行が非Null、ユニーク、または外部キー制約に違反する値を含んでいます。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] LINQでInclude()は何をするのですか?
-
[解決済み] 1つのPostgreSQLクエリで複数のWITHステートメントを使用するには?
-
[解決済み] SQL Server : 列を行に変換する
-
[解決済み] SQLのSELECTでIF...THENを実行するにはどうすればよいですか?
-
[解決済み] ...値に挿入する ( SELECT ... FROM ... )
-
[解決済み] SQL Server - 挿入された行のIDを取得するための最良の方法は?
-
[解決済み] SQL Serverでストアドプロシージャ内のテキストを検索する
-
[解決済み] ある列の最大値を持つ行を取得する
-
[解決済み] SQL Server の CASE ステートメントで OR がサポートされていない。
-
[解決済み] SQL Server 2008を使用してIDENTITY_INSERTをオン/オフする方法は?