gpt4 book ai didi

sql - 如何将一行插入到列中具有默认值的表中?

转载 作者:行者123 更新时间:2023-11-29 14:07:36 25 4
gpt4 key购买 nike

我有这样的表:

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

如何做到正确?

最佳答案

您的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 是一个现有的数值。

关于sql - 如何将一行插入到列中具有默认值的表中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14425843/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com