Удаление записей из базы данных - PullRequest
1 голос
/ 20 марта 2011

Привет, пожалуйста, помоги мне.
У меня есть база данных с большим количеством таблиц. Я должен удалить все записи (кроме 10 с данными идентификатора студента) из всей базы данных, для которой идентификатор студента не входит в данные 10 идентификаторов. studentID - это первичный ключ в таблице и внешний ключ во многих таблицах. я не уверен, что даже другие таблицы могут иметь такой же studentID, теперь я хочу написать скрипт для выполнения этой задачи, который удалит все записи из родительской таблицы, а также дочерних таблиц (sql server 2008).

1 Ответ

5 голосов
/ 20 марта 2011

Для ограничений внешнего ключа сначала необходимо выполнить удаление из дочерних таблиц.

Это будет примерно так, поскольку у вас уже есть идентификаторы StudentID, объединение с родительской таблицей не требуется.

Delete child1 Where studentID not in (1,2,4,5,6,77,122,123,1222,12121,99999)
Delete child2 Where studentID not in (1,2,4,5,6,77,122,123,1222,12121,99999)
Delete child3 Where studentID not in (1,2,4,5,6,77,122,123,1222,12121,99999)
Delete students Where studentID not in (1,2,4,5,6,77,122,123,1222,12121,99999)

Если у вас есть таблица «внуков», например «Ученик» -> «Учетная запись» -> «AccountHistory»), вы удалите ее в обратном порядке, например:

Delete AccountHitory
where AccountID not in (
    select AccountID
    From Account
    Where studentID in (1,2,4,5,6,77,122,123,1222,12121,99999))

Delete Account Where studentID not in (1,2,4,5,6,77,122,123,1222,12121,99999)

Delete Student Where studentID not in (1,2,4,5,6,77,122,123,1222,12121,99999)


НайтиИз иерархии ссылок внешнего ключа вы можете использовать этот запрос

Образцы таблиц

create table student (studentid int identity primary key)
create table student_class (id int primary key, studentid int references student(studentid))
create table student_class_attendance (student_classid int references student_class(id), attended datetime)
create table invoice (id int primary key, studentid int references student(studentid), due datetime, amount money)

Запрос для поиска связанных таблиц

;with tmp(lvl,FK,PK) As (
    SELECT 1, FK.TABLE_NAME, PK.TABLE_NAME
    FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS C 
    INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS FK ON C.CONSTRAINT_NAME = FK.CONSTRAINT_NAME 
    INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS PK ON C.UNIQUE_CONSTRAINT_NAME = PK.CONSTRAINT_NAME 
    WHERE PK.TABLE_NAME = 'student'
    UNION ALL
    SELECT lvl+1, FK.TABLE_NAME, PK.TABLE_NAME
    FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS C 
    INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS FK ON C.CONSTRAINT_NAME = FK.CONSTRAINT_NAME 
    INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS PK ON C.UNIQUE_CONSTRAINT_NAME = PK.CONSTRAINT_NAME 
    INNER JOIN tmp on tmp.FK = PK.TABLE_NAME
)
SELECT *
FROM tmp
order by lvl desc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...