什么你想在这里实现是一个一对多的关系,即每个国家可以有多个语言环境。这无法用单个表格实现,因为您会发现多次出现同一个国家/地区。你应该做的是将数据分成两个表格。你可以在下面找到一个例子。
结构Countries表
- ID INT,自动递增,主键
- 名称VARCHAR
结构,语言环境表
- CountryID整型,主键
- 的LocaleID INT,主键
- 名称varchar
处理INSERT - 要插入国家表格,只需填写姓名字段(或您可能需要的任何其他字段):
INSERT INTO Countries
(Name)
VALUES
('Ireland')
ID字段将自动填充。对于这个例子,我们可以想象“爱尔兰”的ID = 1。
- 要插入语言环境,您需要传递三个值,即CountryID,LocaleID和Name。
INSERT INTO Locales
(CountryID, LocaleID, Name)
VALUES
(1, 1, 'Lorem')
此查询会为ID = 1(即爱尔兰)和'Lorem'作为名称的国家插入LocaleID。要插入“存有”,你会做相同的:
INSERT INTO Locales
(CountryID, LocaleID, Name)
VALUES
(1, 2, 'Ipsum')
哪里的LocaleID将是2,对国家与ID = 1和名称将是“存有”。
如何检索数据
由于现在数据在两个表拆分,你将不得不使用一个加入把它在一起。这很简单:
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年8月11日 - 如何如果你想使用一个表的国家使用一个表(不推荐)
,你必须手动处理的国家标识。也就是说,您将执行INSERT,如下所示:
INSERT INTO Countries
(ID, LocaleID, Name)
VALUES
(:CountryID, :LocaleID, :Name)
但是,这会给您带来问题。想象一下,表格中包含的国家数量未指定,您必须添加一个新的国家。你会给这个新国家什么ID?
你为什么要不同的区域有标识,使有关多大意义为具有相同的客户数量的不同customners。什么时候ID改变,如果它不是一个唯一的标识符,它是什么? – 2012-08-10 23:19:04
@Tony Hopkinson:我想成为ID + LOCALES_ID一个唯一的标识符。我想这是因为用户选择了哪个国家,例如“美国”。如果另一个用户浏览网站的地区fr_FR(法语),我需要向其展示'美国国家统计局'。通过这种方式,我总是保存user.country_id = countries.id,当显示时我可以做'SELECT u.name,c.name FROM users u LEFT JOIN countries c ON u.country_id = c.id AND c.locales_id = “2''。我需要这个网站的多个部分,所以有这个我如何描述它对我非常有用。谢谢! – udexter 2012-08-10 23:26:36