我有一个名为countries
的表,其结构为:ID,LOCALES_ID,NAME
我想用这个表处理多个语言环境,所以我需要对于不同的LOCALES_ID,ID是相同的。所以,如果我插入:
INSERT INTO countries (locales_id, name)
VALUES
('1', 'Lorem'),
('2', 'Ipsum');
我想要的最终结果是:
ID | LOCALES_ID | NAME
1 | 1 | Lorem
1 | 2 | Ipsum
但是我试过INSERT,我得到了下一个结果:
ID | LOCALES_ID | NAME
1 | 1 | Real insert
2 | 2 | Real insert #2
我的countries
表在列ID和LOCALES_ID上有一个PRIMAY索引,我认为当我插入不同的语言环境时,这就是我需要的所有内容。我得到相同的ID。
我如何解决这个问题?
提前谢谢你,
答案 0 :(得分:1)
您在此处尝试实现的是一对多关系,即每个国家/地区可以有多个区域设置。使用单个表无法实现这一点,因为您会发现自己多次出现相同的国家/地区。您应该做的是将数据拆分为两个表。你可以在下面找到一个例子。
国家/地区的结构
- ID int,autoincrement,primary key
- 名称varchar
区域设置表的结构
- CountryID int,主键
- LocaleID int,主键
- 名称varchar
处理INSERT - 要在Countries表中插入,只需填充Name字段(或您可能需要的任何其他字段):
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。要插入'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)
就是这样。现在,您的查询将返回Country在其正确的Locale中的名称(如果存在)。如果没有,CountryName和LocaleID将为NULL。
更新2012/08/11 - 如何使用单个表格(不推荐)
如果您希望为国家/地区使用单个表格,则必须手动处理国家/地区ID。也就是说,您将按如下方式执行INSERT:
INSERT INTO Countries
(ID, LocaleID, Name)
VALUES
(:CountryID, :LocaleID, :Name)
然而,这会给你留下一个问题。想象一下,该表包含未指定数量的国家/地区,您必须添加一个新的国家/地区。你会给这个新国家什么ID?
答案 1 :(得分:0)
也许有点像
Locales
(LocalID, LocaleName) Use the standard id e.g. en-GB
Primary Key (LocaleID)
国家(可能必须为比利时(Waloon和Flemish)等国家开展这项工作
(CountryID,CountryLocaleID)
Primary Key (CountryID)
ForeignKey CountryLocaleID -> Locales(LoacleID)
(添加任何其他国家/地区特定信息,但不是名称!
CountryTranslations
(CountryID, LocaleID,InternationalisationID)
Primary Key(CountryID,LocaleID)
Unique Key(InternationalisatiosnID)
Foreign Key CountryID -> Countries.CountryID
Foreign Key LocaleID -> Locales.LocaleID
Foreign Key InternationalisationID -> Internationalisations.InternationalisationID
(这是您在各种语言区域中的国家/地区名称之间的链接
Internationalisations
(InternationalsationID, Translation)
PK (InternationalisationID)
(所有翻译。)