PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment faire en sorte que la clé étrangère de la table enfant ait la même valeur que la clé principale d'auto-incrémentation du parent

DEFAULT fonctionnera pour SERIAL car il définit la valeur par défaut pour la colonne. Alors

INSERT INTO Purchase VALUES (DEFAULT,'Lendl');

devrait marcher. Mais PurchasedItem.purchaseID n'a pas de valeur par défaut définie, il essaie donc d'insérer NULL (et null n'est pas encore dans la colonne référencée), donc cela échoue.

essayez :

INSERT INTO Purchase(custName) VALUES ('Lendl') RETURNING purchaseID;

vous verrez la valeur de purchaseID inséré , utilisez-le dans la requête suivante :

INSERT INTO PurchasedItem(purchaseID, itemNo) VALUES (_the_value_above_, 111);
commit;

Si vous voulez qu'il soit utilisé sans interactivité, utilisez DO bloquer avec returning purchaseID into _value

mettre à jour :

ou cte, qch comme

WITH i AS (
  INSERT INTO Purchase(custName, orderedDate) 
  VALUES ('Lendl', '2016-09-28') 
  RETURNING purchaseID
)
insert into PurchasedItem
select i.purchaseID,'smth',3
from i