J'essaye de créer une base de données simple où j'ai une table des données de client et une table des données de commande. J'essaie d'écrire une contrainte qui fait qu'un client ne peut pas commander plus d'une quantité spécifique d'articles un jour donné. Voici ce que j'ai:Contraintes et assertions dans PostgreSQL
CREATE TABLE CUSTOMER
(
CUSTOMER_NUM CHAR(3) PRIMARY KEY,
CUSTOMER_NAME CHAR(35) NOT NULL,
STREET CHAR(15),
CITY CHAR(15),
STATE CHAR(3),
ZIP CHAR(5),
);
CREATE TABLE ORDERS
(
ORDER_NUM CHAR(5) PRIMARY KEY,
ORDER_DATE DATE,
CUSTOMER_NUM CHAR(3),
CONSTRAINT CUSTOMER_NUM_FKEY FOREIGN KEY (CUSTOMER_NUM)
REFRENCES CUSTOMER (CUSTOMER_NUM) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE CASCADE
);
Et c'est ce que j'ai écrit pour appliquer cette contrainte, mais cela ne fonctionne pas. Je suppose que c'est parce que ORDER_NUM et ORDER_DATE n'ont jamais des valeurs égales.
CREATE ASSERTION ITEM_LIMIT
CEHCK(
( SELECT COUNT(*)
FROM CUSTOMER C1, ORDERS O1
WHERE C1.CUSTOMER_NUM = O1.CUSTOMER_NUM AND
O1.ORDER_DATE = O1.ORDER_NUM
) <= 1000
Ma question est comment faire fonctionner cette contrainte, comme comment limiter le nombre de commandes par jour.
L'assertion n'est pas un [travail clé réservé pour postgresql] (http://www.postgresql.org/docs/9.1/interactive/sql-keywords-appendix.html), bien que ce soit pour sql-99 et 92. –
@Clodoaldo: Ce n'est pas pertinent. C'est un mot clé dans PostgreSQL, ce n'est pas un mot clé * réservé *; ce qui signifie que, bien que 'ASSERTION' soit compris comme un mot clé dans un contexte comme' CREATE ASSERTION ... ', il est autorisé à être utilisé comme identifiant (donc quelque chose comme' CREATE TABLE assertion ... 'est autorisé). Et PostgreSQL n'accepte * pas * les instructions CREATE ASSERTION, mais il n'applique pas les assertions qu'elles décrivent. – ruakh
@ruakh Si vous essayez de créer une assertion dans PostgreSQL (au moins jusqu'à 9.4), vous obtiendrez ERROR: CREATE ASSERTION n'est pas encore implémenté. Donc je dirais que ça ne les accepte pas. Le comportement que vous décrivez (accepter, mais ne pas appliquer) ressemble plus à MySQL. – beldaz