2011-01-22 5 views
2

テーブルの制約を使用してコンポジットプライマリキーを作成すると、idフィールドはに自動インクリメントになりますか?または何が選択肢ですか?コンプリートプライマリキーのあるテーブル、オートインクリメントのあるフィールドの1つ

CREATE TABLE IF NOT EXISTS atable(
     id   INTEGER NOT NULL, --I want to autoincrement this one 
     name  TEXT NOT NULL, 
     anotherCol TEXT, 

    PRIMARY KEY(id, name)); 
+1

なぜプライマリキーに名前を入れますか?名前を一意にするには、CREATE UNIQUE INDEXを使用するだけではどうですか? –

答えて

5

いいえ、プライマリキーは1つのみです。これはidとnameの複合です。

IDをプライマリキーにし、名前をインデックス付き代替キーにする場合は、名前に一意の制約を与え、idにプライマリキーを付ける必要があると言います。

0

ここに、SQLite FAQページへのリンクがあります。このページでは、整数の主キーを自動インクリメントする方法についての質問が#1です。

CREATE TABLE IF NOT EXISTS atable(
    id   INTEGER PRIMARY KEY, -- use NULL for this column on INSERT to autoinc 
    name  TEXT NOT NULL, 
    anotherCol TEXT); 

duffymoとKalebによって示唆されているように、名前に一意索引を作成します。http://www.sqlite.org/faq.html#q1

はここにあなたのSQLを少し手直しです。

0

OPは名前が一意であることを望んでいません。 (しかし、私は間違っている可能性があります。)いずれにせよ、あなたは

  1. INTEGER PRIMARY KEYを使用し、その列にNULLを挿入することにより、自動インクリメントの整数を取得することができ、かつ
  2. は(IDにUNIQUE制約を使用してスーパーキーを宣言し、名)。

スーパーキーは候補キー(この場合はプライマリキー)と1つ以上の列にすぎません。

CREATE TABLE yourtable(
    id INTEGER PRIMARY KEY, 
    name TEXT NOT NULL, 
    CONSTRAINT superkey UNIQUE (id, name) 
); 

あなたがPRAGMA foreign_keys = on;を使用して外部キーのサポートをオンにすると、スーパーキーは他のテーブルの外部キー制約の対象とすることができます。しかし、私はそれがあなたが探していたものであるとは確信していません。

関連する問題