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 pos
peut être mis à jour par l' utilisateur en faisant glisser des colonnes dans une interface graphique.
Comme name
et id
sont uniques et mettre à jour plusieurs lignes à la fois que je l' utilise INSERT
et au ON DUPLICATE KEY UPDATE
lieu de UPDATE
lors 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 à pos
et def_pos
ainsi 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 UPDATE
seul passage dans les conflits lors de la permutation deux valeurs. Ainsi , je ne peux pas dire pos = VALUES(pos)
quand pos
existe - 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?
- ...
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