Car*_*rey 4 postgresql insert cte auto-increment
我有一个具有以下架构的数据库设置:
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
);
Run Code Online (Sandbox Code Playgroud)
我的表单中的数据采用以下格式:
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"
}
}
}
Run Code Online (Sandbox Code Playgroud)
我将如何大量地将数据插入到许多类型表中,以便它们引用插入到一种类型表中的元组?
我构造了这个查询:
INSERT INTO siteInfo (siteName, siteHost, notes, allowableCountries, displayChance, imagePath)
VALUES ('Sample', 'sample.com', 'note', 'NONE', '50', '../var');
Run Code Online (Sandbox Code Playgroud)
然后我需要将数据插入siteLinks表中,这与表中已有的条目相关siteInfo。
INSERT INTO siteLinks (siteID, URL)
VALUES ((SELECT siteid FROM siteinfo WHERE sitename='Sample'), 'test');
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来做到这一点?
使用数据修改 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;
Run Code Online (Sandbox Code Playgroud)
BEGIN;
INSERT INTO siteInfo (siteName, siteHost, notes, ... )
VALUES ('Sample', 'sample.com', 'note', ... );
INSERT INTO siteLinks (siteID, URL)
VALUES (lastval(), 'test');
COMMIT;
Run Code Online (Sandbox Code Playgroud)
有关的:
| 归档时间: |
|
| 查看次数: |
2665 次 |
| 最近记录: |