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? P>
3 Réponses :
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. P>
Consultez http://dev.mysql.com/doc/ Refman / 5.0 / FR / insertion.html et configurez votre logique en conséquence. P>
Il existe de nombreuses façons de faire cela qui sont beaucoup mieux que "forcer une ligne" dans la base de données. P>
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: p>
Ensuite, vous définissez simplement Tous les utilisateurs qui ne sont pas des administrateurs: p>
Créez une autre table qui identifie un utilisateur en tant qu'administrateur utilisant une relation de clé étrangère. P>
Maintenant, vous ajoutez simplement la référence à Créer des utilisateurs de table (ID INT NON NULL PRIMARY KEY KEY_INCREMENTEMENT, NOM VARCHAR (20), IS_Admin Bool par défaut 0); Code> P>
is_admin code> sur
1 code> pour un administrateur et recherchez l'administrateur: p>
Sélectionnez ID, nom des utilisateurs où is_admin; code> p>
Sélectionnez ID, nom à partir des utilisateurs où n'est pas_admin; code> p> li>
Créez des utilisateurs de table (ID INT NON NULL Auto_incrimentation Touche principale, Nom Varchar (25)); Code> P>
Créer des administrateurs de table (ID INT NON NULL Auto_Incrememnt Touche primaire, Userid Int, Touche étranger (ID utilisateur) Utilisateurs (ID)); Code> P>
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 code> adminateurs code> (par opposition à l'ajout de nombreuses colonnes plus tard dans votre
utilisateurs code> Tableau). P> < / li>
ol>
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
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 Ceci fonctionne car la colonne ne peut avoir jamais une valeur unique (le 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 note forte>: 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 Edité pour ajouter: < / Strong> Ce n'est pas infaillible. La valeur "Erreur" pour un edit 04/21: strong> Depuis MySQL 8.0.16, MySQL prend en charge les contraintes / Code> (ou la clé
de la table code>):
Enum code > n'a qu'un seul cas, et ne peut pas être
null code>) et le
unique code> (ou
primaire code>) impose que chaque ligne de la table Doit avoir une valeur différente pour la colonne. p>
Enum code>. La limite de MySQL 5.7 est effectivement 255 cas, mais à ce stade, il serait plus facile de prendre la clé
non queue code> sur une colonne code> tinyint non signé à la place. Cependant, je n'ai pas pu trouver un moyen de faire respecter une table em> 0 ou n lignes; Cette solution n'appliquera que "entre 0 et n", car MYSQL n'a pas de travail
vérifier code> contraintes. (Bien sûr, où n est un, comme dans cet exemple, le même effet est atteint.) P>
généré toujours comme (le moins (plus grand (single_row_value, 0), 0)) virtuel )), car les moteurs de stockage n'aiment pas passer des index sur des colonnes générées virtuelles. Ceci est documenté pour travailler pour InnoDB dans MySQL depuis 5,7.8, mais cela ne fonctionne certainement pas à Mariambb 10.1 à partir de cette écriture. Em> p>
Enum code> 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, ...); code> 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! Em> p>
cocher code>. Voir https://dev.mysql.com /doc/refman/8.0/fr/Create-table-check-constraints.html em> p> p>
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!
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?