我的情况是这样的:从多个表中删除数据的最佳方法?
我想从数据库中多个删除数据表(超过10)。
将使用一个表(PRICE)
作为删除触发器。例如。如果STATUS = "VOID"
则从该表中删除数据,并随后删除所有其他数据。
PRICES
主键是大多数其他表的外键。
还要注意,这些其他表格全都链接到另一个表格。
我应该创建一个在10个表之间加入并使用此联接进行删除吗?
或者我可以只从PRICING链接到另一个表,然后使用连接链接到其余的其他表?
我的情况是这样的:从多个表中删除数据的最佳方法?
我想从数据库中多个删除数据表(超过10)。
将使用一个表(PRICE)
作为删除触发器。例如。如果STATUS = "VOID"
则从该表中删除数据,并随后删除所有其他数据。
PRICES
主键是大多数其他表的外键。
还要注意,这些其他表格全都链接到另一个表格。
我应该创建一个在10个表之间加入并使用此联接进行删除吗?
或者我可以只从PRICING链接到另一个表,然后使用连接链接到其余的其他表?
不要让事情复杂化。只需将所有的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
相当于这是什么,使用Hibernate/JPA删除? – java123999
@ java123999这是完全不同的问题。你为什么不创建一个新的问题引用我的答案? – Fandango68
您可以详细说明如何使用连接删除吗?你的外键约束是通过'on delete cascade'建立的吗?如果不是这样,为什么不直接从每张表中删除,根据他们的关系,“PRICES”最后? –
如果不是为什么不直接从每张表中删除,基于他们的关系,价格最后?这听起来很有用,这是什么意思? – java123999
我可以使用Hibernates级联删除吗? – java123999