在 MySQL 中使用关系

Using relations in MySQL

假设我有以下 tables:

Elements:
  (int) ID
  (int) Name_id

Names:
  (int) ID
  (varchar) Name

Elements.Name_idNames.id有内在联系。用户以 html 形式输入元素名称。然后 php 脚本将元素名称插入元素 table。我的问题来了:

是否可以在插入查询中指定元素名称而不是元素 name_id?如果没有,我将不得不:

SELECT `ID` FROM `Names` WHERE `Names`.`Name` LIKE "$php_variable";
...
INSERT INTO `Elements` SET `Name` = "$php_variable";

当然,第二个 $php_variable 是前一个查询的结果。

你可以这样做:

insert into elements(name)
    select n.name
    from names n
    where n.id = $php_variable;

话虽如此,不要采用这种方法。你的数据结构是错误的。在大多数情况下,您想要连接到 names.id,而不是 names.name。 (有一些例外情况,复制名称可能是缓慢变化维度的一种解决方案,但我怀疑这是您的用例。)

所以,修复数据结构。创建 table 语句如下所示:

create table names (
    name_id int auto_increment primary key,
    name varchar(255) unique
);

create table elements (
    element_id int auto_increment primary key,
    name_id int,
    foreign key (name_id) references names(name_id)
);

然后在需要时使用显式 JOIN 获取名称。

注意:我将 table 的 ID 更改为 "tablename_Id"。这不是必需的,但我发现外键和主键具有相同的名称很有帮助。