Comment restreindre une valeur de colonne dans SQLite / MySQL

je voudrais restreindre une valeur de colonne dans une table SQL. Par exemple, les valeurs de la colonne ne peuvent être que "voiture" ou "vélo" ou "camionnette". Ma question Est de savoir comment réaliser ceci en SQL, et est-ce une bonne idée de le faire du côté de la base de données ou devrais-je laisser l'application restreindre l'entrée.

j'ai également l'intention d'ajouter ou de supprimer d'autres valeurs dans le futur, par exemple "camion"

le type de bases de données que j'utilise sont SQLite et MySQl

16
demandé sur marc_s 2011-06-16 08:21:47

5 réponses

Ajouter un nouveau tableau contenant ces moyens de transport, et faire de votre colonne une clé étrangère à cette table. De nouveaux moyens de transport peuvent être ajoutés au tableau à l'avenir, et la définition de votre colonne reste la même.

avec cette construction, je choisirais définitivement de régler ceci au niveau du DB, plutôt que celui de l'application.

32
répondu NGLN 2011-06-16 04:36:23

pour MySQL, vous pouvez utiliser le type de données ENUM.

column_name ENUM('petit', 'moyenne', 'grande')

Voir MySQL référence: le type ENUM

Pour ajouter à cela, je trouve qu'il est toujours préférable de se restreindre sur la DB côté et sur le côté app. Un Enum plus une boîte de sélection et vous êtes couvert.

18
répondu nageeb 2011-06-16 04:35:11

Oui, il est recommandé d'ajouter des contraintes check. Les contraintes de vérification sont utilisées pour assurer la validité des données dans une base de données et pour assurer l'intégrité des données. Si elles sont utilisées au niveau de la base de données, les applications qui utilisent la base de données ne seront pas en mesure d'ajouter des données invalides ou de modifier des données valides de sorte que les données deviennent invalides, même si l'application elle-même accepte des données invalides.

Dans SQLite:

create table MyTable
(
    name string check(name = "car" or name = "bike" or name = "van")
);

In MySQL:

create table MyTable
(
    name ENUM('car', 'bike', 'van')
);
8
répondu Alex Aza 2011-06-16 04:52:51

vous utiliseriez une contrainte de contrôle. Dans SQL Server, il fonctionne comme ceci

ALTER TABLE Vehicles
ADD CONSTRAINT chkVehicleType CHECK (VehicleType in ('car','bike','van'));

Je ne suis pas sûr que ce soit la norme ANSI mais je suis certain que MySQL a une construction similaire.

4
répondu Bob Probst 2016-05-11 20:20:16

si vous voulez utiliser la validation côté DB, vous pouvez utiliser des déclencheurs. Voir pour SQLite, et ceci en détail comment - pour MySQL.

donc la question est vraiment de savoir si vous devez utiliser la validation de la base de données ou non. Si vous avez plusieurs clients -- qu'il s'agisse de programmes différents, ou de plusieurs utilisateurs (avec éventuellement des versions différentes du programme) -- alors aller dans la base de données est certainement préférable. La base de données est (espérons) centralisée, de sorte que vous pouvez dissocier certains détails de la validation. Dans votre cas particulier, vous pouvez vérifier que la valeur insérée dans la colonne est contenue dans un tableau séparé qui liste simplement les valeurs valides.

d'un autre côté, si vous avez peu d'expérience avec les bases de données, prévoyez de cibler plusieurs bases de données différentes, et n'avez pas le temps de développer une expertise, peut-être que la simple validation du niveau de l'application est le choix le plus opportun.

2
répondu Dilum Ranatunga 2011-06-16 04:35:59