Question

J'ai deux tables. Ces tables ont deux relations entre elles.

Table 1
   * ID_XPTO (PK)
   * Detail

Table 2
   * ID_XPTO (FK) (PK)
   * ID_XPTO2 (FK) (PK)

Ces deux relations existent.

Table 1 -< Table2 
Table 1 -< Table2

Ma question est que je dois supprimer une ligne du tableau 1. Je le fais actuellement,

declare @table Table (xptoTable2 int)
insert into @table
        select ID_XPTO2
        from Table2 
        where ID_XPTO = @ID_XPTO

delete from Table2
where ID_XPTO = @ID_XPTO

delete from Table
where ID_XPTO in (select xptoTable2from @table)

Je sais que je pourrais utiliser ON DELETE SET NULL sur la table2. De cette façon, je pourrais ensuite rechercher toutes les lignes avec une valeur nulle sur ID_XPTO2 et les supprimer, mais DBA ne veut pas les utiliser.

Existe-t-il une meilleure solution pour exécuter ce processus?

Était-ce utile?

La solution

Vous avez les options suivantes:

  • Supprimez deux déclarations, comme vous le faites maintenant. Supprimer d'abord du tableau 2.

  • Supprimez deux tables en une seule instruction, si votre marque de base de données prend en charge la syntaxe DELETE multi-tables (par exemple, MySQL). Ce n'est pas du SQL standard, mais c'est pratique.

  • Utilisez des contraintes d'intégrité référentielle en cascade (je crois comprendre que votre administrateur de base de données a annulé cette option).

  • Écrivez un déclencheur BEFORE DELETE sur Table1 pour supprimer ou définir NULL toute référence dans la Table2. Vérifiez auprès de votre administrateur de base de données si cela est plus acceptable que les contraintes RI en cascade.

Enfin, je conseillerais de parler à votre administrateur de base de données et de poser la même question que vous avez posée ici. Découvrez quelle solution il / elle préférerait que vous utilisiez. Les utilisateurs de StackOverflow peuvent répondre à des questions techniques, mais il semble que vous ayez à faire face à une question de politique informatique .

Autres conseils

Utilisez ON DELETE CASCADE. Cela va automatiquement supprimer les lignes de référencement.

Pourquoi n'utilisez-vous pas ON DELETE CASCASE?

DROP TABLE t_f
DROP TABLE t_m
CREATE TABLE t_m (id INT NOT NULL IDENTITY PRIMARY KEY , value VARCHAR(50))
CREATE TABLE t_f (id INT NOT NULL IDENTITY PRIMARY KEY, m INT, CONSTRAINT fk_m FOREIGN KEY (m) REFERENCES t_m(id) ON DELETE CASCADE)
INSERT INTO t_m (value) VALUES ('test')
INSERT INTO t_f (m) VALUES (1)
DELETE FROM t_m
SELECT * FROM t_m
SELECT * FROM t_f

id           value
------------ ------
0 rows selected

id           m
------------ ------
0 rows selected

Je connais deux méthodes:

  1. Vous pouvez utiliser ON DELETE CASCADE

  2. Ecrivez votre code SQL pour nettoyer après lui-même, par exemple:

     DECLARE @DetailCriteria ...
    
     SET @DetailCriteria = '....'
    
     BEGIN TRAN
     -- First clear the Table2 of any child records
        DELETE FROM Table2 
        WHERE 
          ID_XPTO IN (SELECT ID_XPTO FROM Table1 WHERE Detail = @DetailCriteria)
          OR ID_XPTO2 IN (SELECT ID_XPTO FROM Table1 WHERE Detail = @DetailCriteria)
    
     -- Next clear Table2 (which will delete fine because you've followed the referential chain)
        DELETE FROM Table1 WHERE Detail = @DetailCriteria
    
     -- commit if you're happy (should check @@ERROR first)
     COMMIT
    
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top