您在这里尝试实现的是一对多关系,即每个国家/地区可以有多个区域设置。这无法通过单个表格实现,因为您会发现同一个国家/地区出现多次。您应该做的是将数据拆分为两个表。您可以在下面找到一个示例。
国家表的结构
- 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。
INSERT INTO Locales
(CountryID, LocaleID, Name)
VALUES
(1, 1, 'Lorem')
此查询将为 ID = 1 的国家(即爱尔兰)和“Lorem”插入 LocaleID 作为名称。要插入“Ipsum”,您将执行相同的操作:
INSERT INTO Locales
(CountryID, LocaleID, Name)
VALUES
(1, 2, 'Ipsum')
其中 LocaleID 将为 2,对于 ID = 1 且名称为“Ipsum”的国家/地区。
如何检索数据
由于现在数据被拆分为两个表,因此您必须使用 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 - 如何使用单表(不推荐)
如果您希望对国家/地区使用单个表,则必须手动处理国家/地区 ID。也就是说,您将按如下方式执行 INSERT:
INSERT INTO Countries
(ID, LocaleID, Name)
VALUES
(:CountryID, :LocaleID, :Name)
然而,这会给你留下一个问题。假设该表包含未指定数量的国家,您必须添加一个新的。你会给这个新国家什么ID?