MySQL-如何插入到具有多对多关系的表中

MySQL-如何插入到具有多对多关系的表中,mysql,many-to-many,relationship,sql-insert,Mysql,Many To Many,Relationship,Sql Insert,我有一桌人。每个人都有财产,许多人可能有特定的财产。所以这是一种多对多的关系。这是模式: 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

我有一桌人。每个人都有财产,许多人可能有特定的财产。所以这是一种多对多的关系。这是模式:

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 |
+-------------+------------+
有财产

+-----------+-------------+
| 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)。
但我认为一定有更好的办法,不是吗?

这就是我最后要做的。我希望它能帮助别人

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);

您可以使用
SELECT LAST\u INSERT\u ID(),我已经读过这个问题,但它很模糊,对我没有帮助。我知道已经7年了,但是你还记得为什么你用
INSERT IGNORE
而不是
INSERT
来表示
属性
表吗?有什么特别的原因吗?根据它的说法,mysql不会在插入失败的情况下抛出错误。我不知道为什么插入会失败,或者如果失败了,您为什么要继续<代码>设置@property_id=LAST_INSERT_id()将保持不变,并将在以下“has_属性”插入中使用