2017-12-05 11 views
-1

複数のテーブル間でIDの数を制限したいと思います。私は4つのテーブルがあるとしましょう。各テーブルにはIDがありますが、IDの数を制限して、これらのテーブルのいずれかにその番号が既に存在することを複製できません。 1つのテーブルにID 43があるとしましょう。別のテーブルでID 43を拒否して、もう使用できないようにしたいとしましょう。 ありがとう!同じIDが複数のテーブルに影響を与えないことを確認してください

+0

あなたはこれまで何を持っていますか?それとは別に、おそらく別の分野にあるはずのIDに別の意味を付けるようです。 – jeroen

+0

これはデータベースの設計が悪いことを反映しています。あなたは外来キーを考慮しましたか? – AnixPasBesoin

+0

おそらく、アプローチとデータ構造を再考する必要があります。これは、あなたが行かなくても簡単にできない場合、非常に高速に複雑になることがあります。 IDを複製することを恐れている場合は、このデータがすべて同じテーブルにあるように思えます。 – Qirel

答えて

1

IDを出力するための5番目のテーブルがあります。そこで、idAUTO_INCREMENT(これが適切な場合)にすることができます。

  1. は、4つのテーブルの適切に第5回表
  2. 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(); 

注:UPDATESELECTは、任意のトランザクション外で行われる(べき)ことができます。 autocommit=ONモードにする必要があります。 SELECTは接続に固有のものなので、番号を別の接続と混同する可能性はありません。

+0

ありがとう!できます!良い一日を! – Kigris

0

新しい行を挿入するときは、LOCK all four tables (for data insert)、トランザクションを開始し、各テーブルのIDの最大値を読み取り、最大値を選択してその最大値に1を加え、新しい行を挿入してトランザクションを終了し、テーブルのロックを解除します。

これは基本的な解決策です。最後の最大IDをいくつかの場所に保存して最適化を試みることができます。テーブルのロックにより、多数の並行スレッド(たとえば、PHPなど)が行を挿入するときにIDが一意になるようになります。

トリガーを使用して(アプリケーション側ではなくDB側で)行うことができますか。

+0

かなり役に立つと思われますが、データはDB側でのみ変更されるため、私はDB側でかなりnoobです。あなたはあなたの答えを具体化できますか?ありがとう! – Kigris

+0

いいえ:)私はあなたの怠惰を開発しません - 学習を開始:) - 私は上記の私の答えでいくつかのキーワードを与える - Googleそれ –

+0

Gotcha、あなたはそれを行う方法がわからない:) – Kigris

関連する問題