sql >> データベース >  >> RDS >> SQLite

SQLiteで複合キーを自動生成する

    通常のSqliteテーブルは、64ビット整数をキーとして使用するB*ツリーです。これはROWIDと呼ばれます。行を挿入するときに、この値が明示的に指定されていない場合は、値が生成されます。 INTEGER PRIMARY KEY columnは、このROWIDのエイリアスとして機能します。 AUTOINCREMENT キーワード。上記のINTEGER PRIMARY KEYでのみ使用できます。 列は、名前とは逆に、上記のROWIDの計算方法を変更するだけです。値を省略すると、そのキーワードが存在するかどうかに関係なく作成されます。これは、実際にはROWIDであり、数値が必要なためです。詳細はこちら。 (rowid値は通常、昇順で生成されますが、必ずしも順番に生成されるわけではなく、行番号などのように扱うべきではありません)。

    単一のINTEGER以外の主キー 列は一意のインデックスとして扱われますが、ROWIDは真の主キーのままであり(ROWIDテーブルがない場合を除く)、自動生成されません。ですから、いいえ、あなたは(簡単に)あなたが望むことをすることはできません。

    私はおそらく、ショップのテーブル、製品のテーブル、それぞれが独自のIDを持ち、2つの間に多対多の関係を確立するジャンクションテーブルがあるデータベース設計を考え出すでしょう。これにより、店舗間で商品IDが同じになり、人の混乱が少なくなる可能性があります。たとえば、同じチェーンの2つの異なる店舗で同じ商品のSKUが異なるとは思われません。

    次のようなもの:

    CREATE TABLE stores(store_id INTEGER PRIMARY KEY
                      , address TEXT
                        -- etc
                       );
    CREATE TABLE product(prod_id INTEGER PRIMARY KEY
                       , name TEXT
                         -- etc
                       );
    CREATE TABLE inventory(store_id INTEGER REFERENCES stores(store_id)
                         , prod_id INTEGER REFERENCES product(prod_id)
                         , PRIMARY KEY(store_id, prod_id)) WITHOUT ROWID;
    



    1. テーブルの値を使用したPostgresINTERVAL

    2. sp_dbcmptlevelが非推奨になった後、SQL Serverデータベースの互換性を確認するにはどうすればよいですか?

    3. 2020年の5つの珍しいMicrosoftAccessのヒント

    4. Rails / Postgresql SQLの違い(日付付き)