2010-09-08 4 views
0

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)

+0

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? ;-) –

+0

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) –

Répondre

0

ALL() n'est pas standard SQL ** - c'est une extension T-SQL. DB2 ne supporte pas cela. Je ne suis pas sûr de ce que vous essayez de faire avec votre contrainte - il semble que vous essayez de vous assurer que chaque valeur de num dans la table des nombres est inférieure ou égale à 1. Si c'est réellement Dans le cas, vous devez ajouter une contrainte sur la table Numbers, pas sur les participants.

** la norme SQL92, et je ne crois pas qu'il a été ajouté à SQL99 ou SQL2003

+0

Voir mise à jour 2. Les contraintes sont juste des mannequins. –

1

Comment mettre en œuvre une option (ou autre) étrangères contrainte de vérification clé dans SQL Server

create function dbo.meetidinmeetings(@meetid) 
returns bit 
as 
begin 
declare @return bit 
as 
if exists(select 1 from meetings where meetid = @meetid) 
set @return =1 
else 
set @return = 0 
return @return 
end 

alors ...

CREATE TABLE Foo (
meetid INT NOT NULL, 
ismeeting bit NOT NULL DEFAULT 0 

ALTER TABLE FOO 
ADD CONSTRAINT CHK_FOO_MEETID 
CHECK ((ismeeting = 0) or (ismeeting = 1 and dbo.is_meetidinmeetings(meetid) = 1)))