Duplicate KEY UPDATE avec des colonnes uniques

user3342816:

Avoir une table qui contient certains paramètres de l'interface utilisateur pour un tableau de données, généralement comme:

| ID  |   name | alias |   pos  | def_pos | disp |
+-----+--------+-------+--------+---------+------+
|  1  |  name1 | bar   |   1    |    1    |   1  | 
|  2  |  name2 | foo   |   3    |    2    |   1  |
|  3  |  name3 | bar   |   2    |    3    |   1  |
|  4  |  name4 | baz   |   4    |    4    |   0  |
  • ID: PRIMAIRE
  • Nom: UNIQUE

Ici pospeut être mis à jour par l' utilisateur en faisant glisser des colonnes dans une interface graphique.

Comme nameet idsont uniques et mettre à jour plusieurs lignes à la fois que je l' utilise INSERTet au ON DUPLICATE KEY UPDATElieu de UPDATElors de la modification. Ainsi , par exemple si la permutation ligne 2 et 3 de l' exemple ci - dessus:

INSERT INTO
    ui_data_columns (id, name, pos)
VALUES
    (2, '', 2),
    (3, '', 3)
ON DUPLICATE KEY UPDATE
    pos = VALUES(pos)

Comme par:

Jusqu'à présent, si bien: P


Maintenant , ma pensée était d'ajouter UNIQUE à poset def_posainsi qu'une colonne ne peut pas avoir même position. Il est impossible définir deux valeurs de la colonne à la même chose de l'interface utilisateur, mais serait agréable d'avoir les contraintes qu'ils sont uniques et ... eh bien, d'apprendre.

Défi devient alors que si l' on essaie d'utiliser le KEY UPDATEseul passage dans les conflits lors de la permutation deux valeurs. Ainsi , je ne peux pas dire pos = VALUES(pos)quand posexiste - même si elle se rectifié dans la même déclaration (si vous voyez ce que je veux dire). On suppose qu'ils sont insérés dans la séquence de façon typique:

INSERT INTO ui_data_columns (id, name, pos)
VALUES (2, '', 2)
ON DUPLICATE KEY UPDATE pos = VALUES(pos)

# Error: pos = 2 exists

Même si ce fixe est la suivante :

INSERT INTO ui_data_columns (id, name, pos)
VALUES (3, '', 3)
ON DUPLICATE KEY UPDATE pos = VALUES(pos)

Comment s'y prendre?


pensées petites:

  • Magie de requête?
  • Utilisez une copie temporaire de la table sans contraintes claires et remplissage?
  • Supprimer les enregistrements en question d'abord, puis insérer?
  • Supprimez la contrainte pendant la durée de l'insert réappliquer alors?
  • ...
Akina:

Une astuce - utilisation intermédiaire. 3 effectuer des mises à jour-à-dire, non 2.

create table test (id int primary key, pos int unique);
insert into test values (1,1),(2,3),(3,2),(4,4);
select * from test;
id | pos 
-: | -: 
 1 | 1 
 3 | 2 
 2 | 3 
 4 | 4
insert into test values
(3,3), (2,2)
on duplicate key update pos = values(pos);
entrée en double « 3 » pour « » test.pos clés
select * from test;
id | pos 
-: | -: 
 1 | 1 
 3 | 2 
 2 | 3 
 4 | 4
insert into test values
(2,0), (3,3), (2,2)
on duplicate key update pos = values(pos);

select * from test;
id | pos 
-: | -: 
 1 | 1 
 2 | 2 
 3 | 3 
 4 | 4

db <> violon ici

Je suppose que tu aimes

Origine http://10.200.1.11:23101/article/api/json?id=373496&siteId=1
conseillé
Classement