次のスキーマを使用してデータベースをセットアップしています。
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');
これを行うより良い方法はありますか?
データ変更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;
_
関連する回答: