2013-02-12 10 views
5

MySQLデータベース内のテーブルに一意のインデックスを作成する方法はありますか?ユニークな、私が意味する、複数のテーブルにわたって一意(インデックス)制約を作成することはできますか?

   table A ids=1,2,5,7... 

       table B ids=3,4,6,8... 
+0

残念ながら、この制約(「分散キー」)は、標準のSQLリレーショナル制約としてモデル化することはできません。それはいくつかの方法でシミュレートすることができますが、私は時々まだ試みていますが、一般的に "icky"な様々なアプローチがあります!最近、このような状況を避けるために最善を尽くします。可能であれば、もっと「SQLにやさしい」方法でモデルを表現しようとすることをお勧めします。 –

答えて

8

ことで

私は、それが直接の制約を作成することで可能ではないと思います。しかし、一意のIDを取得するための解決策がいくつかあります。

提案は、TRIGGERを使用することです。両方のテーブルのまたはUPDATEの間にIDが存在するかどうかを確認するために、BEFORE INSERTトリガーを作成します。

第2に、UNIQUE個の数字を含む第3のテーブルを作成し、他のテーブル:TableAおよびTableBは、第3のものを参照します。

1

JWのように、これはおそらく3番目のテーブルを使用するとうまくいくでしょう。 MySQLでは、これを簡単にするためにIDフィールドを使うことができます。あなたは、どちらかのテーブルの上に値を挿入する(サンプル挿入をしたいとき、そして、

CREATE TABLE a 
    (
    `id` int, 
    `name` varchar(100), 
    PRIMARY KEY(`id`) 
) 
    ENGINE = INNODB; 
CREATE TABLE b 
    (
    `id` int, 
    `name` varchar(100), 
    PRIMARY KEY(`id`) 
) 
    ENGINE = INNODB; 
CREATE TABLE c 
    (
    `id` int auto_increment, 
    `intable` varchar(10) not null, 
    PRIMARY KEY(`id`) 
) 
    ENGINE = INNODB; 

:非常に簡単な例は、(それ以上の情報を知らなくても、単に名前を持つテーブルのシンプルなバージョン)これらのテーブルを使用しただろう「ジョー・」):

INSERT INTO c (`intable`) VALUES ('a'); 
INSERT INTO a (`id`, `name`) 
    SELECT LAST_INSERT_ID() AS id, 'Joe' AS name; 

Cでintableエントリのための唯一の理由は、あなたがそれがために作成されたテーブルを知っているそうです。代わりに、cに挿入する任意の種類の値を使用できます。

+0

'LAST_INSERT_ID'は、並行性の高いシステムで予期せぬ動作を引き起こす可能性があります。 – singe3

+1

LAST_INSERT_IDは並行性の高いシステムでは何の問題もありません。 http://dev.mysql.com/doc/refman/5.7/en/information-functions.html#function_last-insert-idにあるドキュメントを参照してください。「生成されたIDは、これは、関数が特定のクライアントに返す値が、そのクライアントによってAUTO_INCREMENT列に影響を与える最新の文に対して最初に生成されたAUTO_INCREMENT値であることを意味します。彼ら自身。"あなたはSQL Serverを考えていますか? –

+0

あなたが正しいとは思っていましたが、LAST_INSERT_ID()+ 1を使って別の値を挿入する人もいます。すでにid + 1が使われていると失敗するかもしれません。 – singe3

関連する問題