sql >> Database >  >> RDS >> Oracle

ORA-00933:SQL-opdracht is niet correct beëindigd bij het tegelijkertijd verwijderen van twee tabellen

U kunt niet uit twee tabellen in één instructie verwijderen - er is geen verwijderequivalent van insert all . (Tenzij u beperkingen hebt die het verwijderen trapsgewijs uitvoeren, of een trigger die dat handmatig doet). De documentatie geeft aan dat uw syntaxis niet geldig is, omdat er geen pad is om meer dan één tabel op te geven.

U heeft twee verwijderinstructies nodig, waarbij u eerst de records uit de onderliggende tabel verwijdert:

  DELETE FROM login 
  WHERE login.id_user_login = p_id_user;
  DELETE FROM users
  WHERE users.id_user = p_id_user;

Je zou verander uw externe sleutelbeperking in delete cascade :

alter table login add constraint login_fk_user foreign key (id_user_login)
references users(id_user) on delete cascade;

... wat zou betekenen dat u alleen expliciet hoeft te verwijderen van de users tafel; maar dat is misschien niet echt wat je wilt, omdat het één niveau van validatie verwijdert - je wilt misschien voorkomen dat een bovenliggende sleutel per ongeluk wordt verwijderd als deze kinderen heeft. Twee keer verwijderen kan hier geen kwaad.

Overigens is je eerste ingreep niet vrijblijvend, wat je misschien wel zou verwachten. In deze regel:

    ...
    SELECT * FROM DUAL COMMIT;

... de COMMIT wordt geïnterpreteerd als een alias voor de DUAL tabel, geen afzonderlijk commando. Je hebt een puntkomma nodig na DUAL , en bij voorkeur een nieuwe regel voor de COMMIT; . Maar het wordt over het algemeen als beter beschouwd niet vast te leggen in een procedure en laat de beller op het hoogste niveau beslissen of hij zich vastlegt of terugdraait om de gegevensintegriteit te behouden.




  1. MySQL toevoegtekenreeks

  2. hoe tabellen met 1 op veel relaties te combineren in 1 regel record

  3. Hoe kan SQL Workload Analysis u helpen?

  4. Waarom voert PostgreSQL een sequentiële scan uit op de geïndexeerde kolom?