ここで実装しようとしているのは、1 対多の関係です。つまり、各国は複数のロケールを持つことができます。これは、同じ国が複数回表示されるため、単一のテーブルでは実現できません。すべきことは、データを 2 つのテーブルに分割することです。以下に例を示します。
Countries テーブルの構造
- ID int、自動インクリメント、主キー
- 名前 varchar
Locales テーブルの構造
- CountryID int、主キー
- LocaleID int、主キー
- Name varchar
INSERT の処理 - 国テーブルに挿入するには、名前フィールド (または必要なその他のフィールド) に入力するだけです。
INSERT INTO Countries
(Name)
VALUES
('Ireland')
ID フィールドは自動的に入力されます。この例では、「Ireland」の ID は 1 であると想像できます。
- Locales に挿入するには、CountryID、LocaleID、および Name の 3 つの値を渡します。
INSERT INTO Locales
(CountryID, LocaleID, Name)
VALUES
(1, 1, 'Lorem')
このクエリは、ID = 1 (アイルランド) の国の LocaleID を挿入し、名前として「Lorem」を挿入します。「Ipsum」を挿入するには、同じことを行います。
INSERT INTO Locales
(CountryID, LocaleID, Name)
VALUES
(1, 2, 'Ipsum')
LocaleID は 2 で、ID が 1 で名前が 'Ipsum' の国の場合です。
データの取得方法
データは 2 つのテーブルに分割されているため、Join を使用してそれらをまとめる必要があります。とても簡単です:
SELECT
C.ID AS CountryID
,L.Name AS CountryName
,L.LocaleID
FROM
Countries C
LEFT JOIN
Locales L ON
(L.CountryID = C.CountryID) AND
(L.LocaleID = :InputLocaleID)
それでおしまい。これで、クエリは、存在する場合、適切なロケールでその名前を持つ国を返します。そうでない場合、CountryName と LocaleID は NULL になります。
更新 2012/08/11 - 単一テーブルの使用方法 (非推奨)
国に 1 つのテーブルを使用する場合は、国 ID を手動で処理する必要があります。つまり、次のように INSERT を実行します。
INSERT INTO Countries
(ID, LocaleID, Name)
VALUES
(:CountryID, :LocaleID, :Name)
ただし、これでは問題が残ります。テーブルに不特定多数の国が含まれており、新しい国を追加する必要があるとします。この新しい国にどの ID を付与しますか?