Dans mon cours de base de données que nous utilisons un livre (système de base de données - le Livre complet) qui dit le texte suivant est une instruction create table valide dans la norme SQL:Sous-requête dans tuple contrainte DB2
CREATE TABLE Participants (
meetid INT NOT NULL,
-- ...
CONSTRAINT RoomConstraint
CHECK (1 >= ALL (SELECT num FROM Numbers)
);
Mais DB2 se plaint et donne 20 explications possibles pour expliquer pourquoi cette déclaration échoue. Par conséquent, DB2 ne prend-il pas en charge les sous-requêtes dans les contraintes de tuple? Et sinon, est-ce que TRIGGER est la seule solution pour appliquer la contrainte de sous-requête?
Mise à jour: J'ai trouvé ce lien qui indique qu'il est impossible: http://bytes.com/topic/db2/answers/837390-can-constraint-replace-trigger
Mais encore une fois, est un TRIGGER la seule issue? (Je suis en train de faire respecter une relation où un attribut peut se référer à deux tables différentes (il n'est pas ma base de données))
Mise à jour 2: Il ne fonctionne pas sans ALL
soit:
CREATE TABLE Foo (
meetid INT NOT NULL,
CHECK (meetid IN (SELECT meetid FROM Foo)));
Mise à jour 3: l'idée est que je veux une clé étrangère qui fait référence à deux tables comme les suivantes:
Table Participants (pid, ...)
Table Rooms (room, ...)
Table People (userid, ...)
Essentiellement, un pid doit existe dans les deux Ro oms (pièce d'attribut) ou dans People (attribut userid). Je pourrais en faire partie avec une contrainte de ligne qui vérifie si pid est dans Rooms ou People - mais DB2 ne me le laissera pas. (Je sais qu'il y a beaucoup d'autres choses à contraindre pour émuler la clé étrangère)
Veuillez écrire le vrai DDL. Votre mise à jour # 2 montre une table où vous voulez vérifier qu'un meetid existe déjà dans la même table avant de l'insérer? Comment insérez-vous la première rangée? ;-) –
Avec INTEGRITY OFF :) Je veux juste savoir s'il existe une bonne alternative aux contraintes de ligne quand je dois utiliser des sous-requêtes. Le vrai exemple est long et stupide (une main-in avec une base de données mal conçue) donc je pense qu'il vaut mieux le laisser de côté. Mais je vais vous expliquer plus en détails ce que je veux (voir mise à jour 3 en 2 secondes) –