2016-02-11 72 views
1

我的情况是这样的:从多个表中删除数据的最佳方法?

我想从数据库中多个删除数据表(超过10)。

将使用一个表(PRICE)作为删除触发器。例如。如果STATUS = "VOID"则从该表中删除数据,并随后删除所有其他数据。

PRICES主键是大多数其他表的外键

还要注意,这些其他表格全都链接到另一个表格。

我应该创建一个在10个表之间加入并使用此联接进行删除吗?

或者我可以只从PRICING链接到另一个表,然后使用连接链接到其余的其他表?

+2

您可以详细说明如何使用连接删除吗?你的外键约束是通过'on delete cascade'建立的吗?如果不是这样,为什么不直接从每张表中删除,根据他们的关系,“PRICES”最后? –

+0

如果不是为什么不直接从每张表中删除,基于他们的关系,价格最后?这听起来很有用,这是什么意思? – java123999

+0

我可以使用Hibernates级联删除吗? – java123999

回答

1

不要让事情复杂化。只需将所有的DELETE语句放入存储过程并将其传递给一个键值即可。这是我用来删除与学生ID相关的记录(#SQLServer)

CREATE PROCEDURE [dbo].[spDeleteStudent] 
    @StudentID varchar(10) 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    DECLARE @OldID varchar(10) 
    DECLARE @Error int 

    BEGIN TRY 
     --grab the student from the tblStudents to be sure the ID exists! 
     DECLARE StudentdIDCursor CURSOR FOR 
     SELECT StudentID 
     FROM tblStudents 
     WHERE StudentID = @StudentID 

     BEGIN TRY 
      --Using the studentID found, proceed to delete all tables associated with the student before actually 
      --deleting the tblStudents table row 
      OPEN StudentdIDCursor 
      FETCH NEXT FROM StudentdIDCursor INTO @OldID 
      WHILE @@FETCH_STATUS = 0 
      BEGIN 
       SET @Error = 0 

       BEGIN TRANSACTION DeleteStudent 

       DELETE tblApprenticeships WHERE StudentID = @OldID 
       SELECT @Error = CASE WHEN @@ERROR <> 0 THEN @@ERROR ELSE @Error END 
       DELETE tblApprovedAbsences WHERE StudentID = @OldID 
       SELECT @Error = CASE WHEN @@ERROR <> 0 THEN @@ERROR ELSE @Error END 
       DELETE tblAssessmentMarkbook WHERE StudentID = @OldID 
       SELECT @Error = CASE WHEN @@ERROR <> 0 THEN @@ERROR ELSE @Error END 
       DELETE tblAttendance WHERE StudentID = @OldID 
       SELECT @Error = CASE WHEN @@ERROR <> 0 THEN @@ERROR ELSE @Error END 
       DELETE tblCaveMeeting WHERE StudentID = @OldID 
       SELECT @Error = CASE WHEN @@ERROR <> 0 THEN @@ERROR ELSE @Error END 
       DELETE tblEnrolmentInterestRegister WHERE StudentID = @OldID 
       SELECT @Error = CASE WHEN @@ERROR <> 0 THEN @@ERROR ELSE @Error END 
       DELETE tblExceptionalStudents WHERE StudentID = @OldID 
       SELECT @Error = CASE WHEN @@ERROR <> 0 THEN @@ERROR ELSE @Error END 
       DELETE tblExtendedAbsence WHERE StudentID = @OldID 
       SELECT @Error = CASE WHEN @@ERROR <> 0 THEN @@ERROR ELSE @Error END 
       DELETE tblMidSemesterReports WHERE StudentID = @OldID 
       SELECT @Error = CASE WHEN @@ERROR <> 0 THEN @@ERROR ELSE @Error END 
       DELETE tblNOKRegister WHERE StudentID = @OldID 
       SELECT @Error = CASE WHEN @@ERROR <> 0 THEN @@ERROR ELSE @Error END 
       DELETE tblPreStartStudents WHERE pssEnrolledStudentID = @OldID 
       SELECT @Error = CASE WHEN @@ERROR <> 0 THEN @@ERROR ELSE @Error END 
       DELETE tblQuestionnaireResponse WHERE StudentID = @OldID 
       SELECT @Error = CASE WHEN @@ERROR <> 0 THEN @@ERROR ELSE @Error END 
       DELETE tblShortCourseStudent WHERE StudentID = @OldID 
       SELECT @Error = CASE WHEN @@ERROR <> 0 THEN @@ERROR ELSE @Error END 
       DELETE tblSignatures WHERE StudentID = @OldID 
       SELECT @Error = CASE WHEN @@ERROR <> 0 THEN @@ERROR ELSE @Error END 
       DELETE tblStudentActivityRegister WHERE StudentID = @OldID 
       SELECT @Error = CASE WHEN @@ERROR <> 0 THEN @@ERROR ELSE @Error END 
       DELETE tblStudentAddresses WHERE StudentID = @OldID 
       SELECT @Error = CASE WHEN @@ERROR <> 0 THEN @@ERROR ELSE @Error END 
       DELETE tblStudentAllergyRegister WHERE StudentIDAllergy = @OldID 
       SELECT @Error = CASE WHEN @@ERROR <> 0 THEN @@ERROR ELSE @Error END 
       DELETE tblStudentAssessItemReg WHERE StudentID = @OldID 
       SELECT @Error = CASE WHEN @@ERROR <> 0 THEN @@ERROR ELSE @Error END 
       DELETE tblStudentContactLog WHERE StudentIDContacted = @OldID 
       SELECT @Error = CASE WHEN @@ERROR <> 0 THEN @@ERROR ELSE @Error END 
       DELETE tblStudentCourseAffectiveNotes WHERE StudentID = @OldID 
       SELECT @Error = CASE WHEN @@ERROR <> 0 THEN @@ERROR ELSE @Error END 
       DELETE tblStudentCourseAffectiveReg WHERE StudentID = @OldID 
       SELECT @Error = CASE WHEN @@ERROR <> 0 THEN @@ERROR ELSE @Error END 
       DELETE tblStudentCourses WHERE StudentID = @OldID 
       SELECT @Error = CASE WHEN @@ERROR <> 0 THEN @@ERROR ELSE @Error END 
       DELETE tblStudentElementMarkbook WHERE StudentID = @OldID 
       SELECT @Error = CASE WHEN @@ERROR <> 0 THEN @@ERROR ELSE @Error END 
       DELETE tblStudentFees WHERE StudentID = @OldID 
       SELECT @Error = CASE WHEN @@ERROR <> 0 THEN @@ERROR ELSE @Error END 
       DELETE tblStudentFiles WHERE StudentID = @OldID 
       SELECT @Error = CASE WHEN @@ERROR <> 0 THEN @@ERROR ELSE @Error END 
       DELETE tblStudentMedicalConditionsRegister WHERE StudentIDMedicalCondition = @OldID 
       SELECT @Error = CASE WHEN @@ERROR <> 0 THEN @@ERROR ELSE @Error END 
       DELETE tblStudentProfile WHERE StudentID = @OldID 
       SELECT @Error = CASE WHEN @@ERROR <> 0 THEN @@ERROR ELSE @Error END 
       DELETE tblStudentProgramReg WHERE StudentID = @OldID 
       SELECT @Error = CASE WHEN @@ERROR <> 0 THEN @@ERROR ELSE @Error END 
       DELETE tblStudentQualAffectiveNotes WHERE StudentID = @OldID 
       SELECT @Error = CASE WHEN @@ERROR <> 0 THEN @@ERROR ELSE @Error END 
       DELETE tblStudentQualAffectiveReg WHERE StudentID = @OldID 
       SELECT @Error = CASE WHEN @@ERROR <> 0 THEN @@ERROR ELSE @Error END 
       DELETE tblStudentQualificationReg WHERE StudentID = @OldID 
       SELECT @Error = CASE WHEN @@ERROR <> 0 THEN @@ERROR ELSE @Error END 
       DELETE tblStudentTimetable WHERE StudentID = @OldID 
       SELECT @Error = CASE WHEN @@ERROR <> 0 THEN @@ERROR ELSE @Error END 
       DELETE tblStudentTimeTableAndAttendance WHERE StudentID = @OldID 
       SELECT @Error = CASE WHEN @@ERROR <> 0 THEN @@ERROR ELSE @Error END 
       DELETE tblStudentUnitOutcomes WHERE StudentID = @OldID 
       SELECT @Error = CASE WHEN @@ERROR <> 0 THEN @@ERROR ELSE @Error END 
       DELETE tblStudentUnitRegister WHERE StudentID = @OldID 
       SELECT @Error = CASE WHEN @@ERROR <> 0 THEN @@ERROR ELSE @Error END 
       DELETE tblStudFormativeAssessments WHERE StudentID = @OldID 
       SELECT @Error = CASE WHEN @@ERROR <> 0 THEN @@ERROR ELSE @Error END 
       DELETE tblStudSummativeAssessments WHERE StudentID = @OldID 
       SELECT @Error = CASE WHEN @@ERROR <> 0 THEN @@ERROR ELSE @Error END 
       DELETE tblTimetableClassStudents WHERE StudentID = @OldID 
       SELECT @Error = CASE WHEN @@ERROR <> 0 THEN @@ERROR ELSE @Error END 
       DELETE tblWorkPlacement WHERE WkPlacementStudentID = @OldID 
       SELECT @Error = CASE WHEN @@ERROR <> 0 THEN @@ERROR ELSE @Error END 

       --Finally delete the tblStudents record itself 
       DELETE tblStudents WHERE StudentID = @OldID 
       SELECT @Error = CASE WHEN @@ERROR <> 0 THEN @@ERROR ELSE @Error END 

       IF @Error <> 0 
       ROLLBACK TRANSACTION DeleteStudent 
       ELSE 
       COMMIT TRANSACTION DeleteStudent 

       FETCH NEXT FROM StudentdIDCursor INTO @OldID 
      END 
      CLOSE StudentdIDCursor 
      DEALLOCATE StudentdIDCursor 
     END TRY 
     BEGIN CATCH 
      SELECT 'Could not delete student! Error Message: ' + ERROR_MESSAGE() as ErrorDescription 
     END CATCH 
    END TRY 
    BEGIN CATCH 
     SELECT 'Could not find that student in the database!' 
    END CATCH 
END 
GO 
+0

相当于这是什么,使用Hibernate/JPA删除? – java123999

+0

@ java123999这是完全不同的问题。你为什么不创建一个新的问题引用我的答案? – Fandango68

相关问题