web-dev-qa-db-ja.com

関連テーブルへの挿入

次のスキーマを使用してデータベースをセットアップしています。

CREATE TABLE siteInfo (
    siteID              SERIAL    NOT NULL,
    siteName            TEXT      NOT NULL,
    siteHost            TEXT      NOT NULL,
    notes               TEXT      NOT NULL,
    allowableCountries  TEXT      NOT NULL,
    displayChance       INT       NOT NULL,
    imagePath           TEXT      NOT NULL,
    PRIMARY KEY (siteID)
);

CREATE TABLE siteLinks (
    siteID              SERIAL     NOT NULL,
    URL                 TEXT       NOT NULL,
    FOREIGN KEY (siteID) REFERENCES siteInfo(siteID) ON DELETE CASCADE
);

CREATE TABLE siteDemographicLinks (
    siteID              SERIAL    NOT NULL,
    URL                 TEXT      NOT NULL,
    country             TEXT      NOT NULL,
    chance              INT       NOT NULL,
    FOREIGN KEY (siteID) REFERENCES siteInfo(siteID) ON DELETE CASCADE
);

CREATE TABLE linkVisits (
    siteID              SERIAL     NOT NULL,
    rawVisit            BIGINT     NOT NULL,
    redirects           BIGINT     NOT NULL,
    FOREIGN KEY (siteID) REFERENCES siteInfo(siteID) ON DELETE CASCADE
);

私のフォームから取得したデータは、次の形式です。

array(7) {
["siteName"]=>string(9) "Site Name"
["siteHost"]=>string(9) "SIte Host"
["notes"]=>string(5) "Notes"
["links"]=>array(2) {[0]=>string(6) "Link 1" [1]=>string(6) "Link 2"}
["countries"]=>string(4) "None"
["displayChance"]=>string(2) "15"
["extraLink"]=>array(2) {
   [0]=>array(3) {
      ["url"]=>string(7) "dSite 1"
      ["countries"]=>string(4) "NONE"
      ["chance"]=>string(2) "11"
      }
   [1]=>array(3) {
      ["url"]=>string(6) "dSite2"
      ["countries"]=>string(4) "None"
      ["chance"]=>string(2) "13"
      }
   }
}

多くのタイプのテーブルに挿入したデータが、1つのタイプのテーブルに挿入したタプルを参照するように、テーブルにデータを挿入するにはどうすればよいですか?

このクエリを作成しました:

INSERT INTO siteInfo (siteName, siteHost, notes, allowableCountries, displayChance, imagePath)
VALUES ('Sample', 'sample.com', 'note', 'NONE', '50', '../var');

次に、データをsiteLinksテーブルに挿入する必要があります。これは、すでにsiteInfoテーブルにあるエントリに関連しています。

INSERT INTO siteLinks (siteID, URL)
VALUES ((SELECT siteid FROM siteinfo WHERE sitename='Sample'), 'test');

これを行うより良い方法はありますか?

2
Carey

データ変更CTE を使用して挿入をチェーンします。

_WITH ins0 AS (
   INSERT INTO siteInfo (siteName, siteHost, notes, ... )
   VALUES ('Sample', 'sample.com', 'note', ... );
   RETURNING siteid
   )
INSERT INTO siteLinks (siteID, URL)
SELECT siteid, 'test'
FROM   ins0;
_

または lastval()またはcurrval() を使用します。

_BEGIN;

INSERT INTO siteInfo (siteName, siteHost, notes, ... )
VALUES ('Sample', 'sample.com', 'note', ... );

INSERT INTO siteLinks (siteID, URL)
VALUES (lastval(), 'test');

COMMIT;
_

関連する回答:

3