0

我有這樣的表:如何將行插入列中具有默認值的表中?

-- 
-- PostgreSQL database dump 
-- 

SET statement_timeout = 0; 
SET client_encoding = 'UTF8'; 
SET standard_conforming_strings = on; 
SET check_function_bodies = false; 
SET client_min_messages = warning; 

SET search_path = public, pg_catalog; 

SET default_tablespace = ''; 

SET default_with_oids = false; 

-- 
-- Name: forum; Type: TABLE; Schema: public; Owner: postgres; Tablespace: 
-- 

CREATE TABLE forum (
    forum_id integer DEFAULT nextval('seq_forum'::regclass) NOT NULL, 
    forum_name character varying NOT NULL, 
    group_id integer NOT NULL, 
    forum_parent integer DEFAULT (-1) 
); 


ALTER TABLE public.forum OWNER TO postgres; 

-- 
-- Name: PK_forum; Type: CONSTRAINT; Schema: public; Owner: postgres; Tablespace: 
-- 

ALTER TABLE ONLY forum 
    ADD CONSTRAINT "PK_forum" PRIMARY KEY (forum_id); 


-- 
-- Name: FK_group; Type: FK CONSTRAINT; Schema: public; Owner: postgres 
-- 

ALTER TABLE ONLY forum 
    ADD CONSTRAINT "FK_group" FOREIGN KEY (group_id) REFERENCES groups(group_id) ON UPDATE CASCADE ON DELETE CASCADE; 


-- 
-- Name: FK_parent; Type: FK CONSTRAINT; Schema: public; Owner: postgres 
-- 

ALTER TABLE ONLY forum 
    ADD CONSTRAINT "FK_parent" FOREIGN KEY (forum_parent) REFERENCES forum(forum_id); 


-- 
-- PostgreSQL database dump complete 
-- 

正如你看到的上面,這個表已經(至少應該有......)列forum_parent的默認值。我想一些數據插入到這個表,我不喜歡這樣寫道:

INSERT INTO forum (forum_name, group_id) VALUES('new forum', 1); 

燁,我有ID的組= 1,但這代碼給我:

PostgreSQL error: 23503 ERROR: insert or update on table "forum" violates foreign key constraint "FK_parent" 
DETAIL: Key (forum_parent)=(-1) is not present in table "forum". 

NOTICE: there is no transaction in progress 

如何使對的?

回答

3

您的INSERT聲明是正確的。當您在INSERT聲明中未明確聲明列名時,表中插入的值爲默認值(您的情況爲,它的值爲-1)。

但問題在於參考約束。表forum的列forum_parent取決於同一表的列forum_id的值。由於這DDL說,

ALTER TABLE ONLY forum 
     ADD CONSTRAINT "FK_parent" FOREIGN KEY (forum_parent) 
     REFERENCES forum(forum_id); 

INSERT語句執行過程中,因爲該值-1上不存在forum_id列失敗。

我的建議是從-1默認值更改爲NULL

CREATE TABLE forum 
(
    forum_id integer DEFAULT nextval('seq_forum'::regclass) NOT NULL, 
    forum_name character varying NOT NULL, 
    group_id integer NOT NULL, 
    forum_parent integer DEFAULT NULL 
); 

的區別NULL-1之間是NULL簡直是不明。或者該值不存在,而-1是現有的數值。

+0

好吧,現在我明白了,但有另一個關聯的問題。我該怎麼做:我的子論壇可以有一個父母(其他論壇),然後subforums'forum_parent'列指出其他論壇ID。但也有可能是一個論壇沒有父母(導致它的論壇,而不是一個子論壇,這就是爲什麼'forum_parent'應該是-1)? – Katie

+0

不,論壇的默認值應該是'NULL'而不是'-1',所以將模式更改爲'forum_parent integer DEFAULT NULL'。查詢它很容易,順便說一下,當你只想顯示論壇而不是子論壇時,只需使用'WHERE forum_parent IS NULL'。 –

+0

我這樣做:'alter table forum ALTER COLUMN forum_parent SET default null;'thanks!:) – Katie

2

您添加以下約束:

ALTER TABLE ONLY forum 
ADD CONSTRAINT "FK_parent" FOREIGN KEY (forum_parent) REFERENCES forum(forum_id); 

這基本上說,forum_parent必須forum_id的現有價值相匹配。您可能沒有與forum_id = -1一排,因此它失敗。

你需要創建一個行與forum_id = -1和只有這樣,你可以使用默認值...

另一種選擇是把默認值是因爲forum_parent爲空

+0

我知道我沒有forum_id = -1,但我希望'-1'是這個列中的默認值,當我不用'INSERT'語句傳遞forum_id時。 – Katie

+0

@Katie你不能擁有與外鍵相矛盾的默認值。 – Blachshma

+0

嗯,所以我該怎麼做:我的subforum可以有一個父母(其他論壇),然後subforums'forum_parent'列指出其他論壇ID。但也有可能是一個論壇沒有父母(導致它的論壇,而不是一個子論壇,這就是爲什麼'forum_parent'應該是-1)? – Katie

相關問題