Maison  >  Questions et réponses  >  le corps du texte

Ajoutez des clés étrangères aux types de Big Data tels que les tables mysql varchar (2000)

<p>J'ai deux tables "affiliate_stats" et "transaction", 'affiliate_stats' a la colonne 'affiliate_sales' varchar(2000) (sous-table), et "transaction" a la colonne "_id" varchar(100) clé primaire (table parent)</p> <p>Lorsque j'ajoute une clé étrangère à "affiliate_sales" qui fait référence à "_id" traverser <code>Table de modifications</code>affiliate_stats<code>Ajouter une contrainte</code>fk_affili_sales<code>La clé étrangère (affiliate_sales) fait référence à la transaction (</code>_id<code>);</code< /p> <p> obtenez-moi cette erreur <code> La clé spécifiée était trop longue ; la longueur maximale de la clé est de 3072 par tes</code> Je sais que les deux colonnes doivent être de taille égale, mais dans mon cas, j'ai besoin de tailles différentes pour gérer cela. Recherche dans de nombreuses sources, pas de réponse claire et aucune des solutions n'a fonctionné pour moi. </p>
P粉378264633P粉378264633385 Il y a quelques jours492

répondre à tous(2)je répondrai

  • P粉321676640

    P粉3216766402023-09-06 12:42:54

    sera répertoriéaffiliate_sales 更改为 VARCHAR(100).

    ALTER TABLE `affiliate_stats` 
      MODIFY COLUMN affiliate_tales VARCHAR(100) NOT NULL,
      ADD CONSTRAINT `fk_affili_sales` 
      FOREIGN KEY (affiliate_sales) 
      REFERENCES transaction(`_id`);

    Si c'est le cas transaction(_id) 的外键,那么它不需要是 VARCHAR(2000) car de toute façon, il ne peut jamais contenir une chaîne de plus de 100 caractères.

    Avant de faire cela, assurez-vous qu'il n'y a actuellement aucune chaîne de plus de 100 caractères dans la colonne.


    Répondez à votre commentaire :

    Si vous envisagez de stocker des "tableaux" (c'est-à-dire des chaînes avec des listes séparées par des virgules) dans une colonne, vous devez comprendre que vous ne pouvez de toute façon pas créer de clé étrangère dessus. Une clé étrangère nécessite qu'une colonne associe une valeur à transaction une ligne du tableau. Si vous ajoutez une contrainte de clé étrangère, un seul identifiant peut être stocké dans la colonne.

    Il semble qu'il existe effectivement une relation plusieurs-à-plusieurs entre affiliate_stats et affiliate_statstransaction. Vous avez besoin d'une troisième table pour modéliser la relation plusieurs-à-plusieurs.

    répondre
    0
  • P粉147045274

    P粉1470452742023-09-06 00:41:33

    varchar(2000) Stocke 2000 caractères, mais chaque caractère ne fait pas nécessairement 1 octet. Les caractères européens simples tels que a, 1 et ? font tous un octet. Cependant, ü ou å ou َََُِِّْ occupe plusieurs octets.


    Il est possible que les types de chaînes n'aient pas besoin d'être de la même longueur.

    Cependant, ce n’est pas nécessaire. La clé ne peut pas dépasser 100 caractères. Votre clé primaire est varchar(100), donc la clé étrangère ne comportera pas plus de 100 caractères.

    Cependant, il semble que vous souhaitiez stocker deux types de données différents dans cette colonne. L’un est un certain type de tableau et l’autre est une clé étrangère. vous ne pouvez pas. Les clés étrangères garantissent que chaque valeur a une valeur de clé primaire correspondante.


    À la place, utilisez la clé primaire à incrémentation automatiquepour relier les tables entre elles. C'est plus simple, plus rapide, utilise moins de stockage, est sans ambiguïté et ne change jamais.

    Ajoutez une nouvelle colonne comme clé primaire pour les deux tables. Alors citez-le.


    Vous ne pouvez pas stocker plusieurs clés dans une colonne. MySQL doit être capable de confirmer que chaque clé étrangère possède une clé primaire correspondante, et ne peut le faire qu'en vérifiant qu'elles sont exactement égales.

    Au lieu de cela, si chaque ligne d'affiliation_stats correspond à plusieurs ventes d'affiliation, vous avez besoin d'une table de jointure. C’est ce qu’on appelle une relation un-à-plusieurs. Une ligne d'affiliate_stats est liée à de nombreuses filiales_sales.

    -- I'm assuming we've changed to bigint primary keys.
    create table affiliate_stats_sales (
        affiliate_sales_id bigint not null,
        foreign key(affiliate_sales_id) references affiliate_sales(id),
    
        affiliate_stats_id bigint not null,
        foreign key(affiliate_stats_id) references affiliate_stats(id)
    );

    Maintenant, insérez une ligne dans affili_stats_sales pour chaque affilient_sale que vous souhaitez ajouter à la ligne affilient_stats.

    -- Relate affiliate_sale 100 to affiliate_stats 20
    insert into affiliate_stats_sales(affiliate_sales_id, affiliate_stats_id) values (100, 20)

    Les données de ventes et statistiques sont liées en rejoignant ce tableau. Par exemple, si vous souhaitez voir des statistiques sur les ventes de 100 unités.

    select affiliate_stats.*
    from affiliate_stats
    join affiliate_stats_sales
      on affiliate_stats_sales.affiliate_stats_id = affiliate_stats.id
    where affiliate_sales.id = 100

    Un peu difficile au début, mais très puissant. C'est ainsi que fonctionnent les bases de données relationnelles.

    répondre
    0
  • Annulerrépondre