سؤال

لدي جدولين.تلك الجداول اثنين العلاقة بينهما.

Table 1
   * ID_XPTO (PK)
   * Detail

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

هذين العلاقات موجودا.

Table 1 -< Table2 
Table 1 -< Table2

سؤالي هو أنني بحاجة إلى حذف بعض صف في الجدول 1.أنا حاليا به ،

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)

وأنا أعلم أنني يمكن أن تستخدم في حذف مجموعة فارغة على table2.على أن الطريقة أتمكن من ثم البحث عن جميع الصفوف مع قيمة فارغة على ID_XPTO2 وحذفها ، ولكن DBA لا يريد استخدامه.

هل هناك حل أفضل للقيام بهذه العملية ؟

هل كانت مفيدة؟

المحلول

لديك هذه الخيارات:

  • حذف في بيانين ، كما تقوم به الآن.حذف من Table2 الأولى.

  • حذف من جدولين في بيان ، إن العلامة التجارية الخاصة بك من قاعدة بيانات تدعم multi-table DELETE جملة (مثلا ، MySQL).هذا ليس SQL القياسية, ولكن هذا هو في متناول يدي.

  • استخدام التكامل المرجعي المتتالية القيود (أنا أتفهم DBA وقد عارضنا هذا الخيار).

  • كتابة الزناد BEFORE DELETE على جدول1, حذف أو تعيين NULL أي إشارة في Table2.تحقق مع DBA أن نرى إذا كان هذا هو أكثر قبولا من المتتالية ري القيود.

وأخيرا أنصح يتحدث إلى DBA و يسأل نفس سؤالك هنا.معرفة ما حل انه/انها تفضل استخدام.الناس على ستاكوفيرفلوو يمكن الإجابة على الأسئلة التقنية ، ولكن يبدو أنك تتعامل مع سياسة السؤال.

نصائح أخرى

استخدم ON DELETE CASCADE. انها سوف تلقائيا <م> حذف الرجوع الصفوف.

لماذا لا يتم استخدام 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

طريقتين أعرف من:

  1. هل يمكن استخدامها في تتالي حذف

  2. كتابة SQL الخاصة بك إلى تنظيف بعد نفسها أي:

     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
    
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top