0
votes

Comment écrire une fonction personnalisée pour valider la table de relation

table prix colonne et second offre la table Colonne. La table La table étrangère a appelé Auction_id . J'ai besoin d'écrire une fonction avant d'insérer une nouvelle ligne dans la table BID , cette fonction doit valider le montant de l'enchère doit être supérieur au prix de la vente .

1 commentaires

Votre application ne devrait-elle pas vérifier cela d'abord? Si le soumissionnaire entre dans un prix trop bas, vous devez gérer gracieusement ce scénario plutôt que d'augmenter une erreur?


3 Réponses :


0
votes

Vous pouvez également écrire un prix dans la table de soumission également, il est plus lourd de la taille, mais ne nécessite pas de déclenchement et de vérification de saisie sera beaucoup plus rapide car il ne nécessite pas de recherche supplémentaire.

CREATE TABLE auction (
  auction_id serial PRIMARY KEY,
  price money NOT NULL
);
-- requires extra idx as well
CREATE UNIQUE INDEX ON auction (auction_id, price);

CREATE TABLE bid (
  bid_id serial PRIMARY KEY,
  auction_id int NOT NULL,
  price money NOT NULL,
  bid money NOT NULL CHECK (bid > price),
  FOREIGN KEY (auction_id, price) REFERENCES auction (auction_id, price) ON UPDATE CASCADE ON DELETE CASCADE
);


0 commentaires

-1
votes

Essayez ceci .. strong>

Insérer à l'aide de l'instruction SELECT FORT> P>

insert into bid 
  select <auction_id>, amount
  from auction 
  where auction_id = <auction_Id> and price < amount


5 commentaires

Si cela ne parvient pas à insérer la ligne, il échoue silencieusement. Vous devez inclure comment vérifier si l'insert a réussi dans le cadre de votre réponse.


Merci @matbailie, il y avait une erreur de faute de frappe. Maintenant sa bonne amende.


@Matbailie Lorsque vous insérez la ligne dans une table de la console, la base de données indique le nombre de lignes insérées.


Ce n'est pas une aide lorsque vous insérez une ligne programmatique (à partir d'une application plutôt que d'une console).


@Matbailie Tous les outils / bibliothèque de l'ORM renvoient le statut d'exécution de la requête. En cas d'insertion aussi.



0
votes

J'ai trouvé la solution xxx


2 commentaires

Le SQL dynamique est totalement inutile. Vous pouvez remplacer cela avec Sélectionner un prix dans P de la vente aux enchères où id = new.auduction_id; (et supprimez la requête exécution ... )


Je suis d'accord avec @a_horse_with_no_name, le SQL dynamique peut également être un emplacement supplémentaire où Securcy peut être éventuellement compromis par une injection SQL .. Si vous ne le protégeez pas avec Quote_ident (..) ou ou ou ou ou Quote_Literal (..) en fonction de l'utilisation.