【问题标题】:MySQL - How to insert into table that has many-to-many relationshipMySQL - 如何插入具有多对多关系的表中
【发布时间】:2013-11-11 22:02:59
【问题描述】:

我有一张人桌。每个人都有财产,许多人可能拥有某种财产。所以这是一个多对多的关系。这是架构:

CREATE TABLE persons (
  person_id int(11) NOT NULL AUTO_INCREMENT,
  firstname varchar(30) NOT NULL,
  lastname varchar(30) NOT NULL,
  PRIMARY KEY (person_id)
);

CREATE TABLE properties (
  property_id int(11) NOT NULL AUTO_INCREMENT,
  property varchar(254) NOT NULL UNIQUE,
  PRIMARY KEY (property_id)
);

CREATE TABLE has_property (
  person_id int(11) NOT NULL,
  property_id int(11) NOT NULL,
  PRIMARY KEY (person_id,property_id),
  FOREIGN KEY (person_id) REFERENCES persons (person_id),
  FOREIGN KEY (property_id) REFERENCES properties (property_id)
);

现在假设我想将这个人插入到数据库中:

  • 名字:'约翰'
  • 姓氏:'Doe'
  • 属性:'property_A','property_B','property_C'

人

+-----------+-----------+----------+
| person_id | firstname | lastname |
+-----------+-----------+----------+
|         1 | John      | Doe      |
+-----------+-----------+----------+

属性

+-------------+------------+
| property_id |  property  |
+-------------+------------+
|           1 | property_A |
|           2 | property_B |
|           3 | property_C |
+-------------+------------+

has_property

+-----------+-------------+
| person_id | property_id |
+-----------+-------------+
|         1 |           1 |
|         1 |           2 |
|         1 |           3 |
+-----------+-------------+

到目前为止,我认为最好的事情是在persons表中进行常规插入:

INSERT INTO persons (firstname,lastname) VALUES ('John','Doe');

然后进行选择以找到我刚刚插入的人的 id

SELECT person_id FROM persons WHERE firstname='John' AND lastname='Doe';

为了插入其他两个表(因为我需要知道 person_id)。 但我认为一定有更好的方法,不是吗?

【问题讨论】:

  • 您可以使用SELECT LAST_INSERT_ID() 来检索最后插入的行的Id
  • 对于那些可能说这是重复的人,我已经阅读了这个问题stackoverflow.com/questions/17767973/…,但它含糊不清,对我没有帮助。

标签: mysql many-to-many relationship sql-insert


【解决方案1】:

这就是我最终要做的。我希望它可以帮助某人。

INSERT INTO persons (firstname,lastname) VALUES ('John','Doe');
SET @person_id = LAST_INSERT_ID();

INSERT IGNORE INTO properties (property) VALUES ('property_A');
SET @property_id = LAST_INSERT_ID();
INSERT INTO has_property (person_id,property_id) VALUES(@person_id, @property_id);

INSERT IGNORE INTO properties (property) VALUES ('property_B');
SET @property_id = LAST_INSERT_ID();
INSERT INTO has_property (person_id,property_id) VALUES(@person_id, @property_id);

INSERT IGNORE INTO properties (property) VALUES ('property_C');
SET @property_id = LAST_INSERT_ID();
INSERT INTO has_property (person_id,property_id) VALUES(@person_id, @property_id);

【讨论】:

  • 我知道已经 7 年了,但您还记得为什么您使用 INSERT IGNORE 而不是 INSERT 来代替 properties 表吗?有什么特别的原因吗?
  • 根据mysqltutorial.org/mysql-insert-ignore这意味着mysql不会在插入失败的情况下抛出错误。我不确定为什么插入会失败,或者如果它失败了你为什么要继续。 SET @property_id = LAST_INSERT_ID(); 将保持不变,并将在以下“has_property”插入中使用
猜你喜欢
  • 2021-12-21
  • 2021-09-07
  • 2014-09-16
  • 2020-01-26
  • 2015-03-29
  • 2013-12-01
  • 2013-07-20
  • 2018-10-09
相关资源
最近更新 更多