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

上記のように、このテーブルには、フォーラム_親列にデフォルト値があります (少なくとも ... ある必要があります)。このテーブルにデータを挿入したいのですが、次のようにします。

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

それを正しくする方法は?

4

2 に答える 2

3

あなたのINSERT声明は正しいです。ステートメントで列名を明示的に宣言しない場合INSERT、テーブルに挿入される値がデフォルトになります(この場合は-1)。

しかし、問題は参照制約にあります。forum_parentテーブルの列は、同じテーブルforumの列の値に依存します。forum_idこのDDLが言うように、

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

値が列に存在しないため、INSERTステートメントは実行中に失敗しました。-1forum_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または、が既存の数値である間、値が存在しません。

于 2013-01-20T15:10:35.647 に答える
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初めて、そのデフォルト値を使用できます...

もう1つのオプションは、null許容であるため、デフォルト値をnullにすることです。forum_parent

于 2013-01-20T15:09:10.170 に答える