複数のテーブル間でIDの数を制限したいと思います。私は4つのテーブルがあるとしましょう。各テーブルにはIDがありますが、IDの数を制限して、これらのテーブルのいずれかにその番号が既に存在することを複製できません。 1つのテーブルにID 43があるとしましょう。別のテーブルでID 43を拒否して、もう使用できないようにしたいとしましょう。 ありがとう!同じIDが複数のテーブルに影響を与えないことを確認してください
-1
A
答えて
1
IDを出力するための5番目のテーブルがあります。そこで、id
はAUTO_INCREMENT
(これが適切な場合)にすることができます。
- は、4つのテーブルの適切に第5回表
INSERT
から新しい番号を取得します。
2つのステップは、同じ「トランザクション」内にある必要はありません。
サンプル・シーケンス発生器:
-- Setup:
CREATE TABLE `seq` (
`id` INT UNSIGNED NOT NULL,
`code` char(1) CHARACTER SET ascii NOT NULL,
PRIMARY KEY (`code`)
) ENGINE=InnoDB;
INSERT INTO seq VALUES (0, 'a'); -- The only row for the table
-- Increment and get next value:
UPDATE seq
SET id = LAST_INSERT_ID(id + 1)
WHERE code = 'a';
SELECT LAST_INSERT_ID();
注:UPDATE
とSELECT
は、任意のトランザクション外で行われる(べき)ことができます。 autocommit=ON
モードにする必要があります。 SELECT
は接続に固有のものなので、番号を別の接続と混同する可能性はありません。
+0
ありがとう!できます!良い一日を! – Kigris
0
新しい行を挿入するときは、LOCK all four tables (for data insert)、トランザクションを開始し、各テーブルのIDの最大値を読み取り、最大値を選択してその最大値に1を加え、新しい行を挿入してトランザクションを終了し、テーブルのロックを解除します。
これは基本的な解決策です。最後の最大IDをいくつかの場所に保存して最適化を試みることができます。テーブルのロックにより、多数の並行スレッド(たとえば、PHPなど)が行を挿入するときにIDが一意になるようになります。
トリガーを使用して(アプリケーション側ではなくDB側で)行うことができますか。
関連する問題
- 1. 同じIDの複数の要素に影響を与えますか?
- 2. イベントに影響を与えずにAutoResetEventの値を確認してください。
- 3. MS CRMのフィールドに影響を与えるワークフローを確認してください
- 4. 重複がないことを確認してください
- 5. PostgreSQL:複数のテーブルに影響を与える制約
- 6. サブモジュールコミットがリポジトリと同じであることを確認してください
- 7. dirのファイルが同じであることを確認してください
- 8. MariaDBのAUTO_INCREMENTに影響を与えずにテーブルに行を挿入してください
- 9. 別のレコードにフィールドに同じ値が含まれていないことを確認してください
- 10. 同じコンポーネントの複数のインスタンスが非共有状態であることを確認してください
- 11. テーブルの計算に影響を与えずにデータを削除してください
- 12. idが列に入っていることを確認してください
- 13. チェックされている同じIDのチェックボックスの数を確認してください
- 14. 監査テーブルがアプリケーションで使用されるRAMに影響しないことを確認してください
- 15. 同じ値を持つデータベースを確認してください。
- 16. 2つの角型フィールドに同じ内容がないことを確認してください
- 17. 変数が等しくないことを確認してください(宝くじコード)
- 18. 認めませんルールがすでに確立MongoDBの接続に影響を与えていない
- 19. 多くのテーブルに影響を与えるDB移行のベストプラクティス
- 20. .csvファイルにbashの各行の列数が同じであることを確認してください。
- 21. 2つのテーブルの値が同じであることを確認する(チェックマークを付けてください)
- 22. URLに任意のテキストを追加し、URLに影響を与えないでください。
- 23. 他のエレメントに影響を与えない高さを変更
- 24. 変数が複数のスクリプトに設定されていることを確認してください
- 25. Swift:2つの配列が同じでないことを確認してください
- 26. 新しい値が古い値と同じであることを確認してください。
- 27. ビューが隠されていないことを確認してください。
- 28. すべての `.js`ファイルコードに影響を与えるために" strictモード "を書いてください。
- 29. オプションの複数引数デリゲートメソッドを確認してください。
- 30. jQuery、チェックボックスが同じクラスでチェックされていることを確認してください
あなたはこれまで何を持っていますか?それとは別に、おそらく別の分野にあるはずのIDに別の意味を付けるようです。 – jeroen
これはデータベースの設計が悪いことを反映しています。あなたは外来キーを考慮しましたか? – AnixPasBesoin
おそらく、アプローチとデータ構造を再考する必要があります。これは、あなたが行かなくても簡単にできない場合、非常に高速に複雑になることがあります。 IDを複製することを恐れている場合は、このデータがすべて同じテーブルにあるように思えます。 – Qirel