By using db<>fiddle, you agree to license everything you submit by Creative Commons CC0.
Help with an interesting Postgres question: Why isn't an Index Only Scan used on a partition accessed via the parent table?.
select version();
version |
---|
PostgreSQL 10.12 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 8.3.1 20190507 (Red Hat 8.3.1-4), 64-bit |
CREATE TABLE public.driver_tmp
(
number_driver character varying(250) COLLATE pg_catalog."default" NOT NULL,
cod_driver character varying(250) COLLATE pg_catalog."default" NOT NULL UNIQUE,
full_name character varying(250) COLLATE pg_catalog."default" NOT NULL,
active boolean default 'true',
CONSTRAINT driver_tmp_pkey PRIMARY KEY (number_driver)
);
CREATE TABLE public.driver
(
number_driver character varying(250) COLLATE pg_catalog."default" NOT NULL,
cod_driver character varying(250) COLLATE pg_catalog."default" NOT NULL UNIQUE,
full_name character varying(250) COLLATE pg_catalog."default" NOT NULL,
active boolean default 'true',
CONSTRAINT driver_pkey PRIMARY KEY (number_driver)
);
CREATE TABLE public.driver_false
(
number_driver character varying(250) COLLATE pg_catalog."default" NOT NULL,
cod_driver character varying(250) COLLATE pg_catalog."default" NOT NULL UNIQUE,
full_name character varying(250) COLLATE pg_catalog."default" NOT NULL,
active boolean default 'false',
CONSTRAINT conductor_false_pkey PRIMARY KEY (number_driver)
);
--- Insert
CREATE FUNCTION TR_DRIVER() RETURNS TRIGGER
AS
$$
BEGIN
IF EXISTS(SELECT number_driver, cod_driver
FROM driver AS con
WHERE EXISTS (SELECT * FROM driver_tmp AS tmp
WHERE con.number_driver<>tmp.number_driver AND con.cod_driver=tmp.cod_driver)) THEN
INSERT INTO driver_false(number_driver, cod_driver, full_name)
VALUES (new.number_driver, new.cod_driver, new.full_name);
ELSE
INSERT INTO driver(number_driver, cod_driver, full_name, active)
VALUES (new.number_driver, new.cod_driver, new.full_name, new.active)
ON CONFLICT (number_driver)
DO UPDATE SET
cod_driver=excluded.cod_driver,
full_name=excluded.full_name,
active=excluded.active;
END IF;
RETURN NEW;
END $$
LANGUAGE plpgsql;
--- create new Trigger
CREATE TRIGGER TR_DRIVER_TMP AFTER INSERT OR UPDATE ON driver_tmp
FOR EACH ROW
EXECUTE PROCEDURE TR_DRIVER() ;
INSERT INTO public.driver_tmp(number_driver, cod_driver, full_name )
VALUES ('111111', '1010', 'Juanito Perez');
INSERT INTO public.driver_tmp(number_driver, cod_driver, full_name)
VALUES ('222222', '2020', 'Ariel Humberto');
INSERT INTO public.driver_tmp(number_driver, cod_driver, full_name)
VALUES ('333333', '3030', 'Jorge Toro');
1 rows affected
1 rows affected
1 rows affected
SELECT * FROM driver_tmp;
SELECT * FROM driver;
SELECT * FROM driver_false;
number_driver | cod_driver | full_name | active |
---|---|---|---|
111111 | 1010 | Juanito Perez | t |
222222 | 2020 | Ariel Humberto | t |
333333 | 3030 | Jorge Toro | t |
number_driver | cod_driver | full_name | active |
---|---|---|---|
111111 | 1010 | Juanito Perez | t |
222222 | 2020 | Ariel Humberto | t |
333333 | 3030 | Jorge Toro | t |
DELETE FROM public.driver_tmp;
3 rows affected
--- NEW RECORD
INSERT INTO public.driver_tmp(number_driver, cod_driver, full_name)
VALUES ('111111', '1010', 'Juanito Perez Linguini');
INSERT INTO public.driver_tmp(number_driver, cod_driver, full_name)
VALUES ('222222', '2020', 'Ariel Humberto Lechumbre Agech');
INSERT INTO public.driver_tmp(number_driver, cod_driver, full_name)
VALUES ('444444', '3030', 'Monica Hermez Vanesa Rech');
1 rows affected
1 rows affected
1 rows affected
SELECT * FROM driver_tmp;
SELECT * FROM driver;
SELECT * FROM driver_false;
number_driver | cod_driver | full_name | active |
---|---|---|---|
111111 | 1010 | Juanito Perez Linguini | t |
222222 | 2020 | Ariel Humberto Lechumbre Agech | t |
444444 | 3030 | Monica Hermez Vanesa Rech | t |
number_driver | cod_driver | full_name | active |
---|---|---|---|
333333 | 3030 | Jorge Toro | t |
111111 | 1010 | Juanito Perez Linguini | t |
222222 | 2020 | Ariel Humberto Lechumbre Agech | t |
number_driver | cod_driver | full_name | active |
---|---|---|---|
444444 | 3030 | Monica Hermez Vanesa Rech | f |
--- Select, which should be in "driver_false"
SELECT number_driver, cod_driver, full_name, active
FROM driver AS con
WHERE EXISTS (SELECT * FROM driver_tmp AS tmp
WHERE con.number_driver<>tmp.number_driver AND con.cod_driver=tmp.cod_driver)
number_driver | cod_driver | full_name | active |
---|---|---|---|
333333 | 3030 | Jorge Toro | t |