2009-02-16 6 views
0

J'ai une table, avec deux colonnes, Enter_Time et Leave_Time, comment écrire un script CREATE TABLE qui applique la contrainte Leave_Time> Enter_Time?Définition de la contrainte entre deux champs dans SQL

Edit: Microsoft Access est utilisé

+0

Vous ne dites pas quelle marque de SGBDR que vous utilisez. Notez que MySQL ne supporte pas les contraintes CHECK comme décrit dans les réponses de la plupart des gens. –

+0

J'utilise Microsoft Access – Graviton

Répondre

2
CREATE TABLE foo (
    Leave_Time DATETIME NOT NULL, 
    Enter_Time DATETIME NOT NULL, 
    CONSTRAINT CHK_TIMES CHECK (Leave_Time > Enter_Time)); 
+0

CHECK (Leave_Time IS NULL ou Leave_Time> Enter_Time). Il est préférable de définir Enter_Time au moins une colonne non nulle. –

+0

Très vrai, Jonathan. Edité en conséquence. –

1

Cela dépend de votre moteur de base de données SQL. En supposant que Microsoft SQL Server:

CREATE TABLE [dbo].[Timecard](
    [id] [int] IDENTITY(1,1) NOT NULL, 
    [EnterTime] [datetime] NULL, 
    [LeaveTime] [datetime] NULL, 
CONSTRAINT [PK_Timecard] PRIMARY KEY CLUSTERED 
(
    [id] ASC 
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY] 
) ON [PRIMARY] 

GO 
ALTER TABLE [dbo].[Timecard] WITH CHECK ADD CONSTRAINT [CK_Timecard] CHECK (([EnterTime]<[LeaveTime])) 
GO 
ALTER TABLE [dbo].[Timecard] CHECK CONSTRAINT [CK_Timecard] 

Mais votre question était comment pour l'écrire ... Je ne juste écrit pour vous. Le comment je l'ai fait est plus généralement utile: J'ai utilisé Microsoft SQL Server Management Studio Express (programme libre) et créé une table et une contrainte en utilisant l'interface graphique. Ensuite, je lui ai demandé le script CREATE. De cette façon, je n'ai pas eu besoin d'être un assistant SQL pour écrire le code ci-dessus.

3

En utilisant PostgreSQL:

CREATE TABLE foo (
    -- other columns... 

    enter_time timestamptz NOT NULL, 
    leave_time timestamptz NOT NULL, 
    CONSTRAINT ck_interval CHECK (leave_time > enter_time) 
); 
+0

Quelle est la valeur de leave_time lorsque l'enregistrement est inséré? EOT - fin du temps? –

+0

Avec la déclaration ci-dessus, vous devez fournir des valeurs lors de l'insertion. Les omettre soulève une erreur de contrainte nulle. Vous pouvez ajouter 'DEFAULT 'infinity' :: timestamptz' à la déclaration (ou l'insérer explicitement à chaque fois) pour obtenir une valeur de fin de temps. – gix

Questions connexes