-1
votes

Puis-je ajouter un chèque dans mon script SQL Create Table?

J'ai créé cette table pour ma base de données. xxx

Comment puis-je insérer un chèque qui ne permet pas d'ajouter une réservation s'il y en a déjà un autre avec le même start_date et le même end_date fin du même emplacement?


8 commentaires

Pourquoi voudriez-vous seulement vérifier les dates de début / fin exactes plutôt que de tout chevauchement?


Je ne veux pas que 2 utilisateurs différents puissent faire une réservation pour le même endroit dans les mêmes jours


@Alberto - Mais c'est bien si l'on fait une réservation du 21 au 23 et l'autre fait une réservation du 22ème - 24ème? Intéressant assumer des concepts communs de réserves si oui.


@Damien_the_unbeliever Désolé, tu as raison. Je ne veux pas de cette façon que vous avez dit pourrait être possible. Comment pourrais-je éviter cela?


Ceci est probablement répondu ici: Stackoverflow.com/ Questions / 26735955 / ...


Examiner les contraintes de table


Non liée, mais: unique n'est pas nécessaire si vous utilisez également la touche principale


Vous recherchez une contrainte d'exclusion: Postgresql.org/ Documents / actuels / ...


4 Réponses :


0
votes

Vous devez utiliser le concept de clé principale composite dans la base de données MySQL. Sa désactivation d'insérer des éléments en double dans des colonnes spécifiques.

ALTER TABLE table_name ADD CONSTRAINT constraint_name PRIMARY KEY (Start_Date, End_Date, Location)


4 commentaires

Qui répond à la question initiale, mais pas à ses exigences clarrées qu'il ne veut pas de chevauchement


Je crois, cela fonctionne à coup sûr, même le chevauchement a également besoin d'extra donné, mais son travail est fait de la base de données.


@Dayastark Où devrais-je écrire votre morceau de code dans mon exemple? Et évite-t-il la possibilité d'ajouter deux réservations dans la même période pour le même endroit?


son code SQL qui est exécuté dans l'éditeur de requête de Workbench. Vous simplement ajouter des contraintes pour une clé primaire composite unique.



1
votes

Vous pouvez symboliser une contrainte à la table.

alter Table Réservations Ajouter une contrainte unique_Reservation unique (emplacement, startdate, enddate); P>

Vous aurez besoin d'un déclencheur pour ça. Regardez le code ci-dessus: p> xxx pré>

Le premier insert réussira lorsque le second échouera avec le message d'erreur correspondant si les dates se chevauchent: P>

SQL Error [31000] [45000]: (conn=10) Unable to insert an overlapping reservation


2 commentaires

Puis-je éviter que quelqu'un puisse faire une réservation du 21 au 23 et l'autre fait une réservation du 22 - 24ème pour le même endroit?


Ce n'est pas une syntaxe Postgres valide.



1
votes

Vous pouvez utiliser une contrainte d'exclusion:

CREATE EXTENSION btree_gist;

ALTER TABLE reservation ADD EXCLUDE USING gist (
   location WITH =,
   daterange(start_date, end_date, '[]') WITH &&
);


0 commentaires

1
votes

Ceci fonctionne dans SQL Server. Je n'ai pas accès pour le moment pour vérifier contre Postgres. Vous devrez exécuter dans deux lots différents après avoir créé votre table

première xxx

second xxx


0 commentaires