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

Quelle que soit la ligne, est la seule colonne

<p>Existe-t-il un moyen de rendre la ligne entière unique, quelle que soit la valeur de la colonne ? </p> <p>Donc, si la colonne <code>a</code> contient <code>1</code>, la colonne <code>b</code> si vous insérez <code>2</code> dans la colonne <code>a</code>, insérez <code>1</code> jeté. </p> <pre class="brush:none;toolbar:false;">+---+---+ un b | +---+---+ | 1 | 2 | | 2 | 1 | <- Puisque ce qui précède existe déjà, une erreur sera générée lors de l'insertion. +---+---+ </pre></p>
P粉378264633P粉378264633413 Il y a quelques jours460

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

  • P粉146080556

    P粉1460805562023-09-04 12:21:14

    Vous pouvez utiliser des déclencheurs pour forcer l'exécution. Mais je ne trouve pas de bon moyen d'y parvenir en utilisant les contraintes UNIQUE KEY.

    Si vous modifiez la façon dont vous stockez les valeurs afin qu'elles soient dans une seule colonne, dans plusieurs lignes du tableau ci-joint, il sera plus facile d'utiliser UNIQUE KEY pour renforcer l'unicité.


    Si vous souhaitez indiquer des éléments connexes :

    CREATE TABLE item_group (
      group_id INT AUTO_INCREMENT PRIMARY KEY
    );
    
    CREATE TABLE item_group_members (
      group_id INT NOT NULL,
      member_id INT NOT NULL,
      PRIMARY KEY (group_id, member_id)
    );
    
    INSERT INTO item_group_members VALUES (1, 1), (1, 2);

    Si vous souhaitez que chaque membre apparaisse dans un seul groupe :

    ALTER TABLE item_group_members ADD UNIQUE KEY (member_id);

    répondre
    0
  • P粉186017651

    P粉1860176512023-09-04 11:25:21

    Définissez 2 colonnes virtuelles générées, respectivement minimum et maximum, et définissez-leur des contraintes uniques :

    CREATE TABLE tablename (
      a INT NOT NULL, 
      b INT NOT NULL,
      x INT GENERATED ALWAYS AS (LEAST(a, b)),
      y INT GENERATED ALWAYS AS (GREATEST(a, b)),
      UNIQUE (x, y)
    );

    Voir Démo.

    Ou, pour MySql 8.0+ :

    CREATE TABLE tablename (
      a INT NOT NULL, 
      b INT NOT NULL,
      UNIQUE ((LEAST(a, b)), (GREATEST(a, b))) -- 不要忘记括号 
    );

    Voir Démo.

    répondre
    0
  • Annulerrépondre