28

私は人のテーブルを持っています。人にはそれぞれ財産があり、多くの人が特定の財産を持っている場合があります。したがって、これは多対多の関係です。これはスキーマです:

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

次に、この人物をデータベースに挿入したいとしましょう。

  • 名:「ジョン」
  • 姓:「ドウ」
  • プロパティ:「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';

他の 2 つのテーブルに挿入するため (person_id を知る必要があるため)。しかし、もっと良い方法があるに違いないと思いますね。

4

1 に答える 1

42

これが私がやったことです。誰かの役に立てば幸いです。

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);
于 2013-11-01T19:32:17.453 に答える