同じSQLデータベース内の複数のテーブルで同じ列を更新する方法を知りたいが、これらのテーブルは主キーであるその列を介して相互に関連している他のテーブルのC#で助けてください。複数のテーブルで同じ列を更新する方法
答えて
プライマリキーを変更するのは決して楽しいことではありません。多くの人がナチュラルキーよりもsyntheticを好む理由です。それを行うための単一ステートメントの標準SQL方法はありません。その代わりに、マスター表の行のコピーを新しい主キーでINSERTし、子表をUPDATEして新しい行を参照し、元の行をDELETEする必要があります。
あなたが望むものは、外部キー制約で指定できます。例:ここにチェックMySQL syntax。
このようなものは、あなたのsql-dialectでもうまくいくはずです。
[CONSTRAINT symbol] FOREIGN KEY [id] (index_col_name, ...)
REFERENCES tbl_name (index_col_name, ...) ON UPDATE CASCADE
CREATE TABLE Parent(
PID SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
Name VARCHAR(20),
PRIMARY KEY (PID)
);
CREATE TABLE Child(
CID SMALLINT UNSIGNED NOT NULL PRIMARY KEY,
PID SMALLINT UNSIGNED NOT NULL,
FOREIGN KEY (PID) REFERENCES Parent (PID)
ON UPDATE CASCADE
);
INSERT INTO PARENT (Name) VALUES ('Joe');
INSERT INTO PARENT (Name) VALUES ('Max');
INSERT INTO Child (CID, PID) VALUES (1, 1);
INSERT INTO Child (CID, PID) VALUES (2, 2);
SELECT * FROM Parent;
SELECT * FROM Child;
Parent Child
+------+------+ +------+------+
| PID | Name | | CID | PID |
+------+------+ +------+------+
| 1 | Joe | | 1 | 1 |
+------+------+ +------+------+
| 2 | Max | | 2 | 2 |
+------+------+ +------+------+
UPDATE Parent SET PID='5000' WHERE PID='1';
SELECT * FROM Parent;
SELECT * FROM Child;
Parent Child
+------+------+ +------+------+
| PID | Name | | CID | PID |
+------+------+ +------+------+
| 5000 | Joe | | 1 | 5000 |
+------+------+ +------+------+
| 2 | Max | | 2 | 2 |
+------+------+ +------+------+
このサンプルでは、DB-Systemによって問題が発生する可能性があります。 DBシステムが、あるポイントで "AUTOINC Mode"になっているときにPIDがすでに割り当てられているかどうかをチェックしない場合、autoincremntの値は5000に達する可能性があります。自動増分が指定されている場合、DB-Systemが主キー列をどのように変更するかによって異なります。
質問に答えたいのは、ジッタの回答に記載されているカスケード更新による外部キーです。しかし、ほとんどの設計上の考慮事項のように、このような操作を実行するための根本的な必要性を分析して分析した場合、この質問をする必要はありません。
これは機能しますが、データベースエンティティの主キーが時間の経過とともに信頼できないことを意味します。また、データベースがカスケードを実行するために膨大な作業をしなければならない可能性があります。そのような更新を実行する際のロックが増え、ブロックする可能性が高くなります)。時間をかけて信頼性に関しては
、アカウント上で歴史的な残高を維持して倉庫を持っていると言う:AcctPK
、EffectiveDate
、Balance
、今あなたが潜在的にあなたがこれを追加した場合に更新をカスケード接続するために多数の行を持っていますあなたのDBにはさらに別のカスケードFK関係があります。データウェアハウスが別のデータベースにある場合、参照整合性を強制できないため、カスケードは発生せず、AcctPK
が変更される前からアカウントの連続性が失われました。
各行に何らかの情報のサービスを提供するベンダーにデータをエクスポートするとします。現在、ベンダーが結果を返すと、送信したPKがデータに存在しなくなったため、一部の行を照合することはできません。
これらの両方のケースでは、PKの変更履歴を経時的に保持することでこの問題を回避できますが、最終的には(おそらく)PKの選択肢が悪いことを回避することになります。
プライマリキーが頻繁に変更される場合は、その選択を再考することを強くお勧めします。 1つの代替案は代理人IDENTITY
またはautonumberをPKとして使用することです(その代わりにそれに基づいてFK関係で)。カスケード更新は必要ありません。現在、「ナチュラル」主キーとして使用している他のフィールドは、通常のUPDATE
でカスケードすることなく変更できます。
- 1. 一連の同じSQLテーブルの同じ列を更新する方法
- 2. 同じmysqlテーブル内の複数の行を更新するロジック
- 3. mysqlの同じテーブルから複数の行を更新する
- 4. 同じ列で複数の値を更新する
- 5. postgreSQLの - 同じテーブルに列を更新
- 6. 類似のテーブルの同じ列から列を更新する方法
- 7. MySQL:同じ列の複数の行の値を更新する
- 8. 同じテーブルのMySQLの複数の更新がタイムアウトします
- 9. 複数のテーブルで同じREPORT_COUNTをインクリメントする方法は?
- 10. Github、複数のマシンで同じRepoを追加/更新/削除する方法
- 11. 並列運転ストアドプロシージャと同じテーブルの列を更新する
- 12. 更新方法テーブル結果を同じテーブルに更新しましたか?
- 13. 同じSQLテーブルの複数の行を比較する方法
- 14. Rails:同じテーブルに複数のフォームを提出する方法
- 15. ハイブの複数のテーブルから同じ列を特定する方法
- 16. mysqlの同じ列を持つ複数のテーブルから削除する方法
- 17. EF:複数のスレッドで同じDBテーブルの行を更新します。
- 18. PHPで同じフォーム名で複数の行を更新する
- 19. は、MySQL、PHPで複数のテーブルを更新する方法
- 20. 同じ列で複数の日付書式を変更する方法
- 21. 複数の列で同じクエリを使用する方法
- 22. 同じMysqlテーブル内の複数の行を更新するには
- 23. 複数のアイテムをDynamoDbの同じハッシュキーで更新する
- 24. 異なる値で複数の行に同じ列を更新する
- 25. 他の列と同じ値を更新する方法は?
- 26. 複数のユニークキーで同じテーブルに同じテーブルを結合する
- 27. mysqlの複数のテーブルを更新する方法
- 28. 同じクエリでCodeIgniterを複数回更新する
- 29. 同じテーブルの1つの列から複数の列の値を更新します。
- 30. PHP/MYSQL複数のテーブルを挿入/更新する方法
あなたに役立つ情報が不足しています...詳細を追加してください –