是否可以通过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
?
答案 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)
)