recherche

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

Interdire l'utilisation de la même table cible dans la clause de mise à jour dans MySQL

J'ai une table appelée "employé". Le code de création de table est le suivant :

create table employee(name varchar(50),ph_no varchar(10),e_id varchar(5),pay_scale varchar(5),year varchar(4));

Le contenu du formulaire est le suivant :

insert into employee(name,ph_no,pay_scale,year) values('AMIT','123456','PL-10','2019');
insert into employee(name,ph_no,pay_scale,year) values('AMIT','123456','PL-10','2020');
insert into employee(name,ph_no,pay_scale,year) values('AMIT','123456','PL-11','2021');
insert into employee(name,ph_no,pay_scale,year) values('AMIT','123456','PL-11','2022');

+------+--------+------+-----------+------+
| name | ph_no  | e_id | pay_scale | year |
+------+--------+------+-----------+------+
| AMIT | 123456 | NULL | PL-10     | 2019 |
| AMIT | 123456 | NULL | PL-10     | 2020 |
| AMIT | 123456 | NULL | PL-11     | 2021 |
| AMIT | 123456 | NULL | PL-11     | 2022 |
+------+--------+------+-----------+------+

Maintenant, je veux mettre à jour 'e_id', il vérifiera d'abord s'il y a le même e_id dans le tableau, s'il n'est pas dans le tableau, il mettra uniquement à jour la ligne avec l'e_id donné, sinon il ne sera pas mis à jour. Ma requête de mise à niveau est donc la suivante :

update employee 
set e_id='0132' 
where concat_ws(',',name,ph_no,pay_scale)=concat_ws(',','AMIT','123456','PL-10') 
  and not exists (select e_id 
                  from employee 
                  group by e_id 
                  having count(*)>=1);

Mais cela donne l'erreur suivante :

Erreur 1093 (HY000) : Vous ne pouvez pas spécifier la table cible "employé" à mettre à jour dans la clause FROM J'ai essayé la requête suivante :

update employee set e_id='0132' where
concat_ws(',',name,ph_no,pay_scale)=concat_ws(',','AMIT','123456','PL-10') and 
e_id not in 
    (select e_id from 
    (select e_id from employee group by e_id having count(*)>=1) as t);

Mais cela ne parvient pas non plus à mettre à jour le tableau et affiche les résultats suivants :

Query OK, 0 rows affected (0.01 sec)
匹配的行:0 更改:0 警告:0

J'ai également essayé le code suivant :

update employee set 
employee.e_id='0132' where 
employee.e_id not in (select * from
    (select f.e_id from 
    employee f inner join employee b on 
    b.name=f.name and b.ph_no=f.ph_no and b.pay_scale=f.pay_scale) as tmp) 
and employee.name='AMIT' and employee.ph_no='123456' and employee.pay_scale='PL-10';

Mais cela ne parvient pas non plus à mettre à jour le tableau et donne le résultat suivant : Requête OK, 0 ligne affectée (0,00 seconde) Lignes correspondantes : 0 Modifications : 0 Avertissements : 0 s'il vous plaît, aidez-moi. Merci d'avance.

P粉982009874P粉982009874238 Il y a quelques jours379

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

  • P粉604669414

    P粉6046694142024-04-03 10:18:58

    NULL 的播放方式与某些人期望的 NOT IN 不同:https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=24c176ff4d4e2c52309aaca14cc121c5 因此,只需将 WHERE e_id IS NOT NULL 放在子中询问。另外,HAVING COUNT(*) >= 1 peut être supprimé car il renvoie toujours une valeur de 1 ou plus...

    update
      employee
    set
      e_id='0132'
    where
         name      = 'AMIT'
     and ph_no     = '123456'
     and pay_scale = 'PL-10'
     and e_id      not in (select e_id from 
                            (select distinct e_id
                               from employee
                              where e_id IS NOT NULL
                            )
                            as t
                           );

    https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=2a0b036a7d1db9138e3ab29af3d346f8

    répondre
    0
  • Annulerrépondre