Каков эквивалентный эффект усечения таблицы, когда на таблицу ссылается внешний ключ


person Ophidian    schedule 05.02.2010    source источник


Ответы (4)


Вы можете удалить все строки, а затем выполнить DBCC CHECKIDENT (Tablename, RESEED, 0), чтобы сбросить начальное значение идентификатора.

Но опять же DELETE полностью регистрируется, а TRUNCATE минимально регистрируется и будет во много раз быстрее

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

person SQLMenace    schedule 05.02.2010
comment
Как раз то, что мне было нужно. Я также очищал таблицу ссылок, и скорость не была основным требованием, так как это для автоматической настройки теста. - person Ophidian; 05.02.2010

Тот факт, что на него ссылается внешний ключ, является ключом к тому, что вам нужно не усекать таблицу, иначе вы создадите осиротевшие записи. Вот почему усечение таблицы не допускается, если существует внешний ключ.

Правильный процесс состоит в том, чтобы сначала удалить записи, на которые ссылаются, если они есть, затем удалить ограничение FK, затем усечь таблицу, а затем восстановить ограничение fk. Если вы пропустите первый шаг, вы создадите кошмар целостности данных, когда запись, указывающая на oldid 100, не указывает на новую запись, которой присвоено значение 100, и это не та запись, которой она должна соответствовать.

person HLGEM    schedule 05.02.2010

Вы можете удалить внешний ключ, обрезать таблицу, а затем воссоздать внешний ключ.

person Klaus Byskov Pedersen    schedule 05.02.2010

Вам нужно будет удалить ограничение, обрезать таблицу, а затем снова добавить ограничение. Однако с этим следует быть очень осторожным. Если в таблице есть строки, на которые вы отбрасываете ссылку FK, вы не сможете добавить ее, пока эти строки не будут удалены или столбец FK в другой таблице не будет очищен.

person Ben Hoffman    schedule 05.02.2010