【问题标题】:One to Many MySQL [duplicate]一对多 MySQL [重复]
【发布时间】:2020-12-11 19:02:32
【问题描述】:

可能重复:
MySQL Relationships

我正在尝试在 MySQL 中使用外键创建一对多关系。

两个表,userlocation。每个user 可以有多个location,但每个location 只能有一个user

我该如何配置?如果有帮助,我会使用 HeidiSQL,不过我也可以输入代码。

【问题讨论】:

  • 用户(idusernamelocation);位置(idlocationnameuser);如果用户存在于该位置,则删除之前的记录。
  • 其实,让我问这个问题,以便我更好地理解它。 MySQL 如何知道它是一对多关系与一对一或多对多的关系?这可能是我感到困惑的地方,因为我觉得我理解它(建立关系)而不是它们的工作原理。
  • @James:这完全取决于表和外键 (FK) 的创建方式。应该创建一对一,以便表共享相同的主键 (PK),其中一个表将另一个表作为 FK 引用。创建一个一对多,以便多方的表具有不同的 PK 和指向一侧表上的 PK 的 FK 列。正如我们在您之前的问题中所讨论的那样,通过引入第三个表并基本上创建两个一对多关系来创建多对多。

标签: mysql database-design foreign-keys foreign-key-relationship


【解决方案1】:

MySQL 不知道,也不需要知道关系是 1-1 还是 1-many。
没有 SQL 支持多对多关系,都需要一个将多对多关系拆分为 2 个单独的一对多关系的中间表。

区别在于控制关系的逻辑,即您编写的代码。
通过让表共享相同的主键 (PK) 来维护 1-1 关系。
使用辅助表声明该 PK 作为指向其他表 PK 的外键。

Table chinese_mother (
id integer primary key,
name....
   

Table chinese_child (
id integer primary key,
name ....
....,
foreign key (id) references chinese_mother.id

1 -> manymany <- 1 关系的方向由链接字段的位置决定。

通常每个表都有一个唯一的id,链接字段称为tablename_id
包含链接字段的表是关系的many 侧,另一个表是1 侧。

每个用户可以有多个位置,但每个位置只能有一个用户。

Table user
id: primary key
name......
.....

Table location
id: primary key
user_id foreign key references (user.id)
x
y
.......

通过将链接字段放在location 表中,您可以强制使一个位置只能有 1 个用户。但是,一个用户可以有多个位置。

【讨论】:

    【解决方案2】:

    这里有一个例子几乎正是你所需要的foreign keys in innodb

    CREATE TABLE parent (
      id INT NOT NULL,
      PRIMARY KEY (id)
    ) ENGINE=INNODB;
    
    CREATE TABLE child (
      id INT,
      parent_id INT,
      INDEX par_ind (parent_id),
      FOREIGN KEY (parent_id) REFERENCES parent(id) ON DELETE CASCADE
    ) ENGINE=INNODB;
    

    在您的示例中,用户与父级相同(用户有多个位置,父级有多个子级)并且位置与子级相同(一个位置有一个用户,一个子级有一个父级)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多