8
votes

Est-il possible de limiter une table pour avoir un seul enregistrement dans MySQL?

Salut je suis une zone de développement Web totalement neuve. Je souhaite créer une table pour connaître l'administrateur qui n'a qu'un seul enregistrement (car il n'y a qu'un seul administrateur). Je veux savoir qu'il est possible de définir une manière mysql pour limiter une table spéciale pour avoir un seul enregistrement?


2 commentaires

faire une gâchette sur l'insectification à cette table


Vous ne pouvez pas le faire avec MySQL. Pouvez-vous expliquer pourquoi vous voulez le faire?


3 Réponses :


8
votes

Vous pouvez configurer une gâchette (pour être spécifique, un déclencheur d'insertion) qui compte les enregistrements et, si le nombre est supérieur à 1, il ne permet pas l'opération d'insertion.

Consultez http://dev.mysql.com/doc/ Refman / 5.0 / FR / insertion.html et configurez votre logique en conséquence.


0 commentaires

1
votes

Il existe de nombreuses façons de faire cela qui sont beaucoup mieux que "forcer une ligne" dans la base de données.

  1. Créez la table d'un utilisateur et en elle, créez un champ qui est un drapeau qui identifie un utilisateur en tant qu'administrateur. Cela pourrait être aussi simple que:

    Créer des utilisateurs de table (ID INT NON NULL PRIMARY KEY KEY_INCREMENTEMENT, NOM VARCHAR (20), IS_Admin Bool par défaut 0);

    Ensuite, vous définissez simplement is_admin sur 1 pour un administrateur et recherchez l'administrateur:

    Sélectionnez ID, nom des utilisateurs où is_admin;

    Tous les utilisateurs qui ne sont pas des administrateurs:

    Sélectionnez ID, nom à partir des utilisateurs où n'est pas_admin;

  2. Créez une autre table qui identifie un utilisateur en tant qu'administrateur utilisant une relation de clé étrangère.

    Créez des utilisateurs de table (ID INT NON NULL Auto_incrimentation Touche principale, Nom Varchar (25));

    Créer des administrateurs de table (ID INT NON NULL Auto_Incrememnt Touche primaire, Userid Int, Touche étranger (ID utilisateur) Utilisateurs (ID));

    Maintenant, vous ajoutez simplement la référence à Admin/ / code> lorsque vous insérez un utilisateur qui est un administrateur. Cette approche vous permet d'avoir d'autres drapeaux et propriétés également dans la table adminateurs (par opposition à l'ajout de nombreuses colonnes plus tard dans votre utilisateurs Tableau). < / li>


2 commentaires

Merci Burhan pour suggérer une autre approche


Je suis vraiment impressionné par ce n'est pas la réponse à mon q mais une stratégie beaucoup meilleure



13
votes

tandis que d'autres réponses sont correctes, il est possible de créer de meilleures approches de votre question particulière, il est possible de créer une table à ligne en ajoutant une colonne de dénombrement factice avec seulement un seul cas et en le faisant une clé unique / Code> (ou la clé de la table ): xxx

Ceci fonctionne car la colonne ne peut avoir jamais une valeur unique (le Enum n'a qu'un seul cas, et ne peut pas être null ) et le unique (ou primaire ) impose que chaque ligne de la table Doit avoir une valeur différente pour la colonne.

Ceci pourrait être étendu de manière évidente pour créer des tables qui ne peuvent contenir que 0 et tout nombre spécifique de lignes, jusqu'à la limite pratique d'un Enum . La limite de MySQL 5.7 est effectivement 255 cas, mais à ce stade, il serait plus facile de prendre la clé non queue sur une colonne tinyint non signé à la place. Cependant, je n'ai pas pu trouver un moyen de faire respecter une table 0 ou n lignes; Cette solution n'appliquera que "entre 0 et n", car MYSQL n'a pas de travail vérifier contraintes. (Bien sûr, où n est un, comme dans cet exemple, le même effet est atteint.)

note : Bien qu'il puisse sembler possible d'utiliser un virtuel généré colonne Pour éviter de prendre l'octet supplémentaire du stockage pour la restriction Enum, la plupart des versions de MySQL et de MARIADB lanceront diverses erreurs si vous l'essayez, soit parce qu'une valeur constante ne peut pas être utilisée pour une colonne générée, soit si vous trompez la Database en permettant à cela (par exemple, à l'aide de généré toujours comme (le moins (plus grand (single_row_value, 0), 0)) virtuel

Edité pour ajouter: < / Strong> Ce n'est pas infaillible. La valeur "Erreur" pour un Enum est zéro et d'index démarrez à un, donc insert dans seules valeurs_one_row (0, ...); Insérer dans des valeurs seulement_one_row (1, ...); réussira. Cependant, cette condition est peu susceptible de se poser en fonctionnement normal et il est toujours plus facile de garder une trace d'un déclencheur!

edit 04/21: Depuis MySQL 8.0.16, MySQL prend en charge les contraintes cocher . Voir https://dev.mysql.com /doc/refman/8.0/fr/Create-table-check-constraints.html


2 commentaires

Très bonne réponse. Les tables d'une rangée sont utiles lorsque vous avez besoin d'une variable définie par l'utilisateur persistant.


Excellente réponse!