2009-06-07 15 views
1

私は複合キーを持っていて、一緒になってかなり大きなもの(〜2000バイト)になっています。パフォーマンスに関する考慮事項はありません。一意性を強制するプライマリキーが欲しいだけです。MySql主キー> 900/1000バイト?

MySql doesn't like long primary keys。これを回避する方法はありますか?索引を作成することなく、一意性を強制するだけでしょうか?

プライマリキーを有効にするためにUTF8の代わりにASCIIを使用したくないです(UTF8文字は3バイト必要です)。主キーの

CREATE TABLE `configuration` (
    `Section` varchar(200) NOT NULL, 
    `StoredKey` VARCHAR(200) NOT NULL, 
    `ServiceName` VARCHAR(300) NOT NULL, 
    `ServiceMajorVersion` int unsigned NOT NULL, 
    `ServiceMinorVersion` int unsigned NOT NULL, 
    `ServiceInstanceID` VARCHAR(100) NOT NULL, 
    `StoredValue` VARCHAR(1024) 

, PRIMARY KEY (`Section`, `StoredKey`, `ServiceName`, `ServiceMajorVersion`, `ServiceMinorVersion`, `ServiceID`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 
+0

あなたはテーブル定義を投稿することをお勧めします... –

+0

テーブルが投稿されました。 – ripper234

答えて

3

使用オートインクリメント整数を、別の一意のキーを追加します。

私のテーブルは次のように定義されます。

別の方法としては、unhex(md5(concat(列値として)))binary(16)として主キーを使用して試みることができます。

+2

"自動インクリメント整数PKをちょうどチャックしてください"というのは、多くの人が考えるように思えますが、データベース設計の問題に対する答えではありません。この場合、このスキーマのより深い問題を隠すだけでなく、適切な一意性制約を実施するためにはまったく役に立たなくなります。 – kquinn

+0

@kquinn:もちろんです。私はちょうど長いPKを使って作業する方法に答えるだけです_それを使う良い理由があります。 – Kornel

2

データベースを理解していなくても言うことは難しいですが、正規化が必要な場合があります。プライマリキーではないUNIQUE INDEXを常に作成できます。また、一意の単一列が存在する場合はプライマリキーにし、存在しない場合は代理プライマリキー(INTEGER AUTO_INCREMENT)を作成できます。

0

@ pornelと@CadeRouxが既に投稿したものに同意します。自動インクリメント整数列として代理プライマリキー(ConfigurationId)を作成する方が良いでしょう.dthenは個別の一意のインデックスを作成します。

4

DB構造設計についての本を読んで、そのような主キーを持つテーブルを作成する必要はありません。または、あなたのためにDB構造のための私の作成(プロトタイプ)を誰かを雇う。 これはちょうど友好的なアドバイスです。

+0

ありがとうございましたnoonex、これまでのところ、他の回答は間違ったトラックにあります 爪を叩く:古い靴やガラス瓶? (http://weblogs.asp.net/alex_papadimoulis/archive/2005/05/25/408925.aspx) – MGOwen

4

@porneLが、この場合の正しい答えを持っている、しかし、@Cadeルーと@noonexも正しいです:データベースは、Excelのように使用することを意味するものではありません。

あなたは二次テーブルを持っている必要があります。各表について

CREATE TABLE ServiceInstance (
    ID int(11) unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT, 
    Hash binary(16) NOT NULL, 
    ServiceInstanceID varchar(100) NOT NULL, 
    UNIQUE(Hash) 
); 

を設定行ごとに一意になるデータを除きます。

あなたが挿入します:

INSERT INTO ServiceInstance (Hash, ServiceInstanceID) VALUES (unhex(md5('whatever')), 'whatever'); 

次に、あなたの主テーブルは次のようになります。あなたが行にアクセスする際に主キーが一般的に使用されているよう

CREATE TABLE `configuration` (
    `Section_ID`   int unsigned NOT NULL, 
    `StoredKey_ID`  int unsigned NOT NULL, 
    `ServiceName_ID`  int unsigned NOT NULL, 
    `ServiceMajorVersion` int unsigned NOT NULL, 
    `ServiceMinorVersion` int unsigned NOT NULL, 
    `ServiceInstanceID` int unsigned NOT NULL, 
    `StoredValue`   VARCHAR(1024), 
    UNIQUE (`Section_ID`, `StoredKey_ID`, `ServiceName_ID`, `ServiceMajorVersion`, `ServiceMinorVersion`, `ServiceInstanceID`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

は、代わりにUNIQUEキーを使用します主キーによって常に。単なる制約の場合は、代わりにUNIQUEを使用します。