У нас есть таблица размером 5 ГБ (почти 500 миллионов строк), и мы хотим удалить свойство идентификации в одном из столбцов, но когда мы пытаемся сделать это через SSMS, время истекает.
Можно ли это сделать через T-SQL?
sql
sql-server
tsql
Конрад Джаггер
источник
источник
Ответы:
Вы не можете удалить
IDENTITY
однажды установленную спецификацию.Чтобы удалить весь столбец:
Информация об ALTER TABLE здесь
Если вам нужно сохранить данные, но удалить
IDENTITY
столбец, вам необходимо:IDENTITY
столбца в новый столбецIDENTITY
столбец.источник
identity
столбец используется как частьforeign key
в другой таблице, вам придется сначала сбросить ограничения, а затем принять меры, поскольку @AdamWenger упомянул об удалении идентификатора.attribute/property
Вы также можете просмотреть эту ссылку для получения более подробной информации только об удалении атрибута: blog.sqlauthority.com/2009/05/03/… .. Удачи!Если вы хотите сделать это без добавления и заполнения нового столбца , без переупорядочивания столбцов и почти без простоев из-за того, что данные в таблице не меняются, давайте сделаем магию с функцией разделения (но поскольку разделы не используются, вы не не нужна версия Enterprise):
ALTER TABLE [Original] SWITCH TO [Original2]
exec sys.sp_rename
чтобы переименовать различные объекты схемы обратно в исходные имена, а затем вы можете воссоздать свои внешние ключи.Например, учитывая:
Вы можете сделать следующее:
источник
Это создает путаницу с ограничениями внешнего и первичного ключей, поэтому вот несколько сценариев, которые помогут вам на вашем пути:
Сначала создайте повторяющийся столбец с временным именем:
Затем получите имя ограничения первичного ключа:
Теперь попробуйте сбросить ограничение первичного ключа для своего столбца:
Если у вас есть внешние ключи, это не удастся, поэтому в таком случае следует отказаться от ограничений внешнего ключа. СОХРАНИТЕ СЛЕДУЮЩИЕ ТАБЛИЦЫ, КОТОРЫЕ ВЫ ЗАПУСКАЕТЕ, ЧТОБЫ ДОБАВИТЬ ОГРАНИЧЕНИЯ НАЗАД В ПОЗЖЕ !!!
После того, как все ваши ограничения внешнего ключа будут удалены, вы сможете удалить ограничение PK, отбросить этот столбец, переименовать свой временный столбец и добавить ограничение PK в этот столбец:
Наконец, снова добавьте ограничения FK:
Эль Фин!
источник
Select t.name 'Table', i.name 'Index', c.name 'Column', i.is_primary_key, i.is_unique From sys.tables t Inner Join sys.indexes i On i.object_id = t.object_id Inner Join sys.index_columns ic ON ic.object_id = i.object_id And i.index_id = ic.index_id Inner Join sys.columns c ON ic.object_id = c.object_id and ic.column_id = c.column_id Where t.name = 'tableName' Order By t.name, i.name, i.index_id, ic.index_column_id
У меня была такая же проблема. 4 оператора в SSMS вместо использования графического интерфейса, и это было очень быстро.
Сделайте новую колонку
alter table users add newusernum int;
Копировать значения поверх
update users set newusernum=usernum;
Отбросьте старую колонку
alter table users drop column usernum;
Переименуйте новый столбец в старое имя столбца
EXEC sp_RENAME 'users.newusernum' , 'usernum', 'COLUMN';
источник
Следующий скрипт удаляет поле Identity для столбца с именем Id.
Надеюсь, поможет.
источник
Нижний код работает нормально, когда мы не знаем имя столбца идентификатора .
Необходимо скопировать данные в новую временную таблицу, например
Invoice_DELETED
. и в следующий раз мы используем:Для получения дополнительной информации см. Https://dba.stackexchange.com/a/138345/101038.
источник
Однако приведенный выше код работает, только если нет отношения первичного и внешнего ключа.
источник
Просто для тех, у кого такая же проблема, как и у меня. Если вы просто хотите сделать вставку только один раз, вы можете сделать что-то вроде этого.
Предположим, у вас есть таблица с двумя столбцами
и хотите вставить строку с ID = 4. Итак, вы переустановили ее на 3, поэтому следующая - 4
Сделайте вставку
И верните свое семя к наивысшему идентификатору, допустим, 15
Готово!
источник
У меня было такое же требование, и вы могли попробовать этот способ, который я лично вам рекомендую. Пожалуйста, вручную спроектируйте свою таблицу и сгенерируйте скрипт, и то, что я сделал ниже, было переименованием старой таблицы, а также ее ограничением для резервного копирования.
источник
В SQL Server вы можете включать и выключать вставку удостоверения следующим образом:
УСТАНОВИТЬ IDENTITY_INSERT имя_таблицы ВКЛ.
- запустите свои запросы здесь
ВЫКЛЮЧИТЬ IDENTITY_INSERT имя_таблицы
источник