2017-02-11 7 views
0

良い一日に複数の値をマージしたい場合は、SQL Serverの外部キーは:私たちは

のは、私たちが、列がある親テーブルがあるとしましょう:

[1] id, int, Identity, Primary 
[2] name, nvarchar, unique 

と子テーブル:

[1] parent, nvarchar, FK reference [parent].[name], ON UPDATE CASACADE 
[2..] other columns 

親テーブルに複数のエントリがあるとしたら、たとえば

| id | name | 
| 0 | test1 | 
| 1 | test2 | 
| 2 | test3 | 

であり、すべてが[子]テーブルの行を参照しています。 test1をtest3に「マージ」したい場合(つまり、test1は参照できません。test1を参照するすべての行はtest3になります)、[parent]。[name]は一意です...これを解決する方法はありますか問題?

+2

私はそれを取得しません。達成したい結果を表示します。また、これらをテーブルの更新として使用するか、クエリの結果として使用するかを明確にします。 –

+0

なぜ子テーブルの親をnvarcharと呼ぶのですか? INTである親ID列によって子供を親にリンクさせる方がよい。また、最善の方法は、常にnvarchar列の長さを指定することです。 nvarchar(30)。 – andrews

答えて

1

nameを外部キーとして使用することを選択した理由がわかりません。その場合、親テーブルにidがあるという利点が失われます。

私が正しく理解している場合:あなたがしたいことは、'test1'を参照するすべての子ローを'test3'に移動し、'test1'を一掃することです。私は[1]として[2]pとしてcを使用しています。この例

update c set parent='test3' where parent = 'test1'; 
delete from p where name='test1'; 
1

上記回答者のどちらも、あなたのPK/FK関係への参照を作成し、私は強く同意するものとします。プライマリテーブルのID列をPKにし、FKをPK ID値に設定することが常にベストプラクティスです。

プライマリテーブルが問題なく表示されます。問題が発生したのはFKリファレンスです。私はに(質問で提供される)子テーブルを変更します

[1] parentid, int, FK reference [parent].[id], ON UPDATE CASACADE 

主な質問への答えは、それをカスケードオプションとは何の関係もない新しいPKを、参照するためにあなたの外国テーブルを更新しているが、外部表の行に関連付けられたPK固有の名前が変更されます。外部キーを変更した後、次の2つのt-SQL文を実行できます。

UPDATE Child 
SET parentid = 2 
WHERE parented = 0 

DELETE 
FROM Parent 
WHERE ID = 0 
関連する問題