Puis-je créer une clé primaire comme 'C0001, C0002' et pour le fournisseur 'S0001, S0002' dans une table? P>
11 Réponses :
non. Si vous avez vraiment besoin de cela, vous devrez générer une pièce d'identité manuellement. P>
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 rompre dans deux éléments de données discrets: Puis définissez AutoIncrement sur et oui, votre clé principale peut être 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. P>
Cela signifie, normaliser les données. Vous allez vous retrouver avec: p>
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. P> li>
ol> c0002 code> n'est pas un champ, mais deux. Même avec xxxnnn code> 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. P>
Colonne_1 Char (1)
colonne_2 entier code> p>
colonne_2 code> p>
(colonne_1, colonne_2) code>, vous n'avez donc pas perdu la signification c0002 code> a pour vous. P> LI >
personne code> ou Organisation code> contenant les données communes ( nom, adresse code> ...) li>
client code> contenant des données spécifiques au client ( CreditLimit CODE> ...) LI>
Fournisseur code> contenant des données spécifiques au fournisseur ( pairsterms code> ...) li>
. li>
ul>
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.
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: p>
ID code>" du type de données " int (10) non signé code>". Li>
- Créez un autre champ "
type code>" du type de données " Enum ('c', 's') code>" (où c = client, S = fournisseur). li>
ul>
comme "@performancedba" a signalé, vous pouvez alors faire l'index de clé primaire pour deux champs " ID code>" & " type code>", de sorte que votre exigence soit remplie avec la méthode correcte. p>
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:
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. P>
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. P>
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. p>
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. p>
Mon approche serait:
Créez un Si vous avez vraiment besoin d'une pièce d'identité avec une lettre ou quelque chose, créez une colonne Essayez quelque chose comme ceci: p> Cette table contiendrait Avec cela, vous avez le meilleur des deux mondes: p> 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 p> li>
Votre identifiant basé sur le personnage, correctement défini, calculé, toujours à jour ..... p> li>
ul> p> ID Identity Identity code> et utilisez-le comme clé primaire (c'est unique, étroit, statique - parfait) p> li>
ID Identité code> p> l>
ul> ID code> Valeurs de 1, 2, 3, 4 ........ code> et le idwithchar code> serait quelque chose comme C000001, C000002, ....., c000042 code> et ainsi de suite. < / p>
... et quand il devient C999999 CODE>, le suivant sera ... C000000 CODE> - 'UH-OH.' Et le prochain - c000001 code>. '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
Premièrement, indiquons que vous ne pouvez pas faire directement. Si vous essayez Le message d'erreur vous indique quels types de données sont pris en charge directement. P> 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. P>
BlockQuote> BTW: J'ai essayé de trouver ces informations dans Bol ou sur MSDN et échoué. P> 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. p> p>
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, p> ANS: Non, vous ne pouvez pas l'utiliser dans une table. p> p>
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.
Nous pouvons ajouter première création de table - strong> p> fonction de contrainte par défaut code> avec la définition de la table pour y parvenir. prikey name
SB3000 Rohit
SB3001 Rohit
SB3002 Rohit
SB3003 Rohit
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");