直接在INSERT INTO语句中使用外键值

时间:2019-08-18 13:07:44

标签: sql postgresql

是否可以通过INSERT INTO语句直接使用外键的值?我正在使用Postgresql,这些表的结构如下:

CREATE TABLE public.sensors
(
    name character varying(100) COLLATE pg_catalog."default",
    description text COLLATE pg_catalog."default",
    id integer NOT NULL DEFAULT nextval('sensors_id_seq'::regclass),
    CONSTRAINT sensors_pkey PRIMARY KEY (id)

)
WITH (
    OIDS = FALSE
)
TABLESPACE pg_default;

ALTER TABLE public.sensors
    OWNER to postgres; 

现在我还有另一个表,定义为:

CREATE TABLE public.testmap
(
    sensor_id integer NOT NULL,
    "timestamp" timestamp with time zone NOT NULL,
    value "char" NOT NULL,
    CONSTRAINT ragmap_sensor_id_fkey FOREIGN KEY (sensor_id)
        REFERENCES public.sensors (id) MATCH SIMPLE
        ON UPDATE NO ACTION
        ON DELETE NO ACTION
)
WITH (
    OIDS = FALSE
)
TABLESPACE pg_default;

ALTER TABLE public.ragmap
    OWNER to postgres;

现在,我尝试将记录直接插入testmap表中,如下所示:

INSERT INTO testmap (sensor_id, timestamp, value) VALUES (1, NOW(), 'r')

我在sensors表中插入了一条ID为1的记录。但是,当我尝试INSERT INTO操作时,我得到:

DETAIL:  Key (sensor_id)=(1) is not present in table "sensors".

是否有一种方法可以直接将INSERT INTO与外键一起使用,而不必求助于Select表中的相关行选择另一个sensors

1 个答案:

答案 0 :(得分:2)

您的代码甚至无法正常工作。为id指定了sensors列。

我不建议将字符列作为主键。如果这样做,则应明确说明您的类型:

INSERT INTO testmap (sensor_id, timestamp, value)
    VALUES ('1', NOW(), 'r');

问题在于您的外键引用是数字,而主键是整数。

相反,将主键定义为数字:

CREATE TABLE public.sensors (
    id serial primary key,
    name character varying(100) COLLATE pg_catalog."default",
    description text COLLATE pg_catalog."default",
    id integer NOT NULL DEFAULT nextval('sensors_id_seq'::regclass),
    CONSTRAINT sensors_pkey PRIMARY KEY (id)
)