简体   繁体   中英

Insert tuple under foreign key constraint

first question posted...

The database is in italian, only thing you should be aware of is that articolo = article, dettagli = details, codice = code/id. I apologize for the inconvenience

I have two tables and each one references to the other one trough the same ID. Here are thetables:

CREATE TABLE IF NOT EXISTS public.articolo
(
    idarticolo integer NOT NULL,
    categoria character varying(15) COLLATE pg_catalog."default" NOT NULL,
    marca character varying(25) COLLATE pg_catalog."default",
    sesso character(1) COLLATE pg_catalog."default" NOT NULL,
    CONSTRAINT articolo_pimary_key PRIMARY KEY (idarticolo),
    CONSTRAINT articolo_dettagli_articolo_foreign_key FOREIGN KEY (idarticolo)
        REFERENCES public.dettagli_articolo (codice_articolo) MATCH SIMPLE
        ON UPDATE CASCADE ON DELETE CASCADE
)

and

CREATE TABLE IF NOT EXISTS public.dettagli_articolo
(
    codice_articolo integer NOT NULL,
    descrizione character varying COLLATE pg_catalog."default",
    prezzo double precision NOT NULL,
    sconto double precision NOT NULL,
    peso double precision NOT NULL,
    CONSTRAINT dettagli_articolo_primary_key PRIMARY KEY(codice_articolo),
    CONSTRAINT dettagli_articolo_articolo_foreign_key FOREIGN KEY (codice_articolo)
        REFERENCES public.articolo (idarticolo) MATCH SIMPLE
        ON UPDATE CASCADE ON DELETE CASCADE
)

I did this simply to be able to delete both of the tuples by deleting one of them on "articolo" or from "dettagli_articolo". I know that the problem could be solved by mergin the two tables into one, or simply without having the foreign key on "articolo" to "dettagli_articolo".

Btw when I try to add a new article into "articolo"

insert into articolo values(999,'','','')

it obviously says that i cannot cause on "dettagli_articolo" the foreign key gets violated cause the tuple with the new articleID isnt on the referenced table.

ERROR: ERROR: the INSERT or UPDATE on the "article" table violates the foreign key constraint "article_details_article_foreign_key"
DETAIL: The key (itemid)=(999) is not present in the table "item_details".

Is there a way to fix this without removing the f_key? Maybe something like when I try to insert a new tuple on "articolo", an empty tuple with only the code gets created on "dettagli_articolo" so that there actully is something to reference to... Maybe even a constraint for the f_key like "ON INSERT"?

I apologize for any misunderstending or bad english:)

I have tried using transactions, inseting both tuples and then commit the transaction but didn't work. I tried having one of them not a primary key, but having the UNIQUE constraint but still nothing. Sadly im new to SQL so i have no idea of other elements

Create one or both of the foreign keys with the option DEFERRABLE INITIALLY DEFERRED . Then the constraint is not checked at the end of the statement, but at the end of the transaction. So you can do

BEGIN;  -- start transaction

INSERT INTO /* the table with the deferred foreign key constraint */
INSERT INTO /* the other table */

COMMIT;  -- the deferred constraint is checked

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM