7
votes

Comment autocrament un Varchar

Puis-je créer une clé primaire comme 'C0001, C0002' et pour le fournisseur 'S0001, S0002' dans une table?


0 commentaires

11 Réponses :


-1
votes

non. Si vous avez vraiment besoin de cela, vous devrez générer une pièce d'identité manuellement.


0 commentaires

22
votes
  1. L'idée dans la conception de la base de données est de garder chaque élément de données séparé. Et chaque élément a son propre type de données, contraintes et règles. Que c0002 n'est pas un champ, mais deux. Même avec xxxnnn ou autre. Il est incorrect et limitera sévèrement votre capacité à utiliser les données et à utiliser des fonctionnalités et des installations de base de données.

    rompre dans deux éléments de données discrets:
    Colonne_1 Char (1)
    colonne_2 entier

    Puis définissez AutoIncrement sur colonne_2

    et oui, votre clé principale peut être (colonne_1, colonne_2) , vous n'avez donc pas perdu la signification c0002 a pour vous.

  2. Ne placez jamais les fournisseurs et les clients (quel que soit le "c" et "s") dans la même table. Si vous faites cela, vous n'aurez pas de table de base de données, vous aurez un fichier plat. Et divers problèmes et limitations conséquent à cela.

    Cela signifie, normaliser les données. Vous allez vous retrouver avec:

    • une table pour personne ou Organisation contenant les données communes ( nom, adresse ...)
    • une table pour client contenant des données spécifiques au client ( CreditLimit ...)
    • une table pour Fournisseur contenant des données spécifiques au fournisseur ( pairsterms ...)
    • Pas de colonnes ambiguës ou facultatives, donc pas de nulls
    • Aucune limitation d'utilisation ou Fonctions SQL
      .

      Et lorsque vous devez ajouter des colonnes, vous ne le faites que là où il est requis, sans affecter toutes les autres poursuites du fichier plat. Le champ d'effet est limité à la portée du changement.


3 commentaires

ERM, voulez-vous dire définir AutoIncrement sur colonne_2 à la place? :)


@Andriy. Merci. J'ai ajouté une explication sur pourquoi.


Merci, j'avais besoin de la suggestion n ° 2 mal.



0
votes

au lieu de faire 'C0001, C0002' pour les clients et "S0001, S0002" pour les fournisseurs d'une table, procédez de la manière suivante:

  • Créez un champ auto-incrément " ID " du type de données " int (10) non signé ".
  • Créez un autre champ " type " du type de données " Enum ('c', 's') " (où c = client, S = fournisseur).

    comme "@performancedba" a signalé, vous pouvez alors faire l'index de clé primaire pour deux champs " ID " & " type ", de sorte que votre exigence soit remplie avec la méthode correcte.


0 commentaires

2
votes

Je préfère les clés primaires artificielles. Vos exigences peuvent également être implémentées comme un index unique sur une colonne calculée: xxx


0 commentaires

1
votes

Attribuer un sens de domaine à la clé primaire est une pratique qui va de côté, retour au moment où les programmeurs de Cobol et les dinosaures ont marché la terre ensemble. La pratique survit à ce jour le plus souvent dans les systèmes d'inventaire existants. Il s'agit principalement d'une manière d'éliminer une ou plusieurs colonnes de données et l'intégration des données de la ou des colonnes éliminées de la valeur PK.

Si vous souhaitez stocker le client et le fournisseur dans la même table, faites-le simplement et utilisez un integer integer PK et ajoutez une colonne appelée contactType ou quelque chose de similaire, ce qui peut contenir les valeurs 'S' et 'C' ou quoi que ce soit . Vous n'avez pas besoin d'une clé primaire composite.

Vous pouvez toujours concaténer ces colonnes (PK et ContactType) sur les rapports, par ex. C12345, S20000, (coulant de l'entier à la chaîne) Si vous souhaitez éliminer la colonne afin de sauvegarder de l'espace (c'est-à-dire sur la page imprimée ou affichée), et tout le monde de votre organisation comprend la Convention que le premier caractère de l'ID d'entité est disponible. pour le code de contactType.

Cette approche permettra de tirer parti des capacités d'auto-interprétation intégrées au moteur de base de données, simplifiez votre PK et votre code associé dans la couche de données, et rendez votre programme et votre base de données plus robustes.


0 commentaires

10
votes

Mon approche serait:

  • Créez un ID Identity Identity et utilisez-le comme clé primaire (c'est unique, étroit, statique - parfait)

  • Si vous avez vraiment besoin d'une pièce d'identité avec une lettre ou quelque chose, créez une colonne calculée basée sur ce ID Identité

    Essayez quelque chose comme ceci: xxx

    Cette table contiendrait ID Valeurs de 1, 2, 3, 4 ........ et le idwithchar serait quelque chose comme C000001, C000002, ....., c000042 et ainsi de suite. < / p>

    Avec cela, vous avez le meilleur des deux mondes:

    • une clé primaire appropriée et parfaitement adaptée (et une clé de clustering) sur votre table, idéale pour être référencée à partir d'autres tables

    • Votre identifiant basé sur le personnage, correctement défini, calculé, toujours à jour .....


2 commentaires

... et quand il devient C999999 , le suivant sera ... C000000 - 'UH-OH.' Et le prochain - c000001 . 'Quoi? Encore?!' :) Je voulais juste souligner que l'utilisation de seulement 6 chiffres ne serait pas très fiable en termes d'évolutivité. Sinon j'aime l'approche. +1


@Andriy m: Oui, vous avez totalement raison - mais vous pouvez également utiliser 8 chiffres, bien sûr, si vous avez besoin de :-) ou 10 - ou 15 - à vous de vous



0
votes

Premièrement, indiquons que vous ne pouvez pas faire directement. Si vous essayez XXX

Le message d'erreur vous indique quels types de données sont pris en charge directement.

msg 2749, niveau 16, état 2, ligne 1 Die 'id'-idpritaitätspalte muss vom Datenp 'int', 'Bigint', "Smallint", 'Tinyint' Oder 'Décimal' BZW. 'Numeric' mit 0 Dezimalstellen Sein Und Darf Keine Null-Werte Zulassen.

BTW: J'ai essayé de trouver ces informations dans Bol ou sur MSDN et échoué.

Maintenant, sachant que vous ne pouvez pas le faire de manière directe, c'est un bon choix de suivre la proposition @marc_s à l'aide de colonnes calculées.


0 commentaires

3
votes

Oui, il s'agit en fait de deux questions différentes, 1. Pouvons-nous utiliser la colonne Varcharne comme une colonne d'incrémentation automatique avec des valeurs uniques telles que les numéros de rouleau dans une classe

ANS: Oui, vous pouvez le faire droit à l'aide de la pièce ci-dessous sans spécifier la valeur de l'ID et P_ID, xxx

  1. Deux incréments différents dans la même colonne,

    ANS: Non, vous ne pouvez pas l'utiliser dans une table.


0 commentaires

0
votes
INSERT INTO Yourtable (yourvarcharID) 
  values('yourvarcharPrefix'+(
      SELECT CAST((SELECT CAST((
      SELECT Substring((
      SELECT MAX(yourvarcharID) FROM [Yourtable ]),3,6)) AS int)+1) 
        AS VARCHAR(20))))
Here varchar column is prefixed with 'RX' then followed by 001, So I selected substring after that prefix of it and incremented the that number alone.

0 commentaires

0
votes

Nous pouvons ajouter fonction de contrainte par défaut code> avec la définition de la table pour y parvenir.

première création de table - strong> p>

prikey  name
SB3000  Rohit
SB3001  Rohit
SB3002  Rohit
SB3003  Rohit


0 commentaires

0
votes

Vous pouvez essayer ci-dessous le code:

SET @variable1 = SUBSTR((SELECT id FROM user WHERE id = (SELECT MAX(id) FROM user)), 5, 7)+1;
SET @variable2 = CONCAT("LHPL", @variable1);
INSERT INTO `user`(`id`, `name`) VALUES (@variable2,"Jeet");
  • 1ère ligne Pour obtenir une dernière carte d'identification insérée en retirant quatre caractères que d'augmenter une valeur et définissez une variable1 li>
  • 2nd ligne pour effectuer une pièce d'identité complète avec quatre préfixes de caractères et assigner à la variable2 li>
  • Insérez une nouvelle valeur avec une nouvelle clé primaire générée = variable2 li>
  • Vous devriez avoir au minimum une donnée dans ce tableau pour fonctionner au-dessus de SQL LI> ul> p>


0 commentaires