mysql - 以正确的方式使用 PRIMARY KEYS(处理语言环境)

标签 mysql

我有一个名为 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 所需的全部内容。

我该如何解决这个问题?

提前谢谢你,

最佳答案

您要在此处实现的是一对多关系,即每个国家/地区可以有多个区域设置。这不能通过一张表来实现,因为您会发现同一个国家多次出现。您应该做的是将数据拆分到两个表中。您可以在下面找到示例。

国家表的结构
- ID int,自增,主键
- 名称 varchar

语言环境表的结构
- CountryID int, 主键
- LocaleID int, 主键
- 名称 varchar

处理插入 - 要在 Countries 表中插入,只需填充名称字段(或您可能需要的任何其他字段):

INSERT INTO Countries
  (Name)
VALUES
  ('Ireland')

ID 字段将自动填充。对于这个例子,我们可以想象“爱尔兰”的 ID = 1。
- 要在 Locales 中插入,您将传递三个值,即 CountryID、LocaleID 和 Name。

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”。

如何获取数据
由于现在数据分为两个表,因此您必须使用 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?

关于mysql - 以正确的方式使用 PRIMARY KEYS(处理语言环境),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11910376/

相关文章:

php - 使用 PHP 和 MySQL 动态更改页面标题

mysql - 按分组列分组?

mysql - 使用现有变量更新 MySQL 数据

php上传数据到mysql服务器

php - 为什么会出现此错误?语法错误或访问冲突 : 1066 Not unique table/alias: 'Employees'

php - 使用 ID 作为身份验证哈希

mysql - 无法将表类型更改为 MyISAM

php - 如何设置 SQL 表以高效、轻松地存储单个事件的多个日期和时间?

mysql - Docker:使用来自主机的--net = host选项访问docker容器中的mysql

php - 将php变量放入mysql查询