Как изменить первичный ключ в базе данных SQL Server 2005 без потери данных?

У меня есть одна таблица в моей базе данных, которая имеет первичный ключ, а его тип данных – varchar (10), но он хранит только 5 символов, поэтому я хочу изменить его тип данных из varchar (10) в varchar (5), не теряя при этом данных ,

В настоящее время я создаю временную таблицу, перемещая данные из исходной таблицы в временную таблицу, затем изменяя ее и, наконец, снова восстанавливая данные из temp в основную таблицу.

Я хочу знать, есть ли другое решение для этой проблемы?

В большинстве СУБД выполнение простого оператора ALTER TABLE выполняло бы всю работу за один раз, не теряя никаких данных. Вы уверены, что MS SQL Server не поддерживает это? (Если нет, возможно, вам нужна лучшая СУБД, но я не думаю, что это будет проблемой.)

Увидев многоступенчатую операцию, я озадачен. В СУБД я использую главным образом все, что необходимо:

ALTER TABLE WhatEver MODIFY pkcolumn VARCHAR(5) NOT NULL; 

Это может быть даже «на месте»; он, казалось бы, завершится почти сразу, хотя фактическое изменение будет происходить в течение длительного времени, так как реальные строки были изменены. (ОК, на самом деле для поля VARCHAR, которое может не произойти, для поля CHAR – которое было бы приличным вариантом, если длина составляет всего 5 или 10 байт, – это будет «на месте»).

Я был для этого для базы данных db2. Это были шаги, предложенные администратором баз данных:

  1. Drop зависимых объектов, таких как представления или procs … Pls. сохранить копию ddl перед выполнением капель
  2. Переименование существующей таблицы может быть _old
  3. Создайте таблицу с правильной структурой.
  4. Выполнять runstats на таблице _old
  5. Загрузите данные из таблицы _old в эту новую таблицу. Загрузка с использованием флага переопределения идентификатора, если вы хотите сохранить столбцы идентификаторов
  6. Воссоздать представление и procs
  7. Переинсталлируйте все зависимые процессы.

Вы можете опустить шаг 4 и 7, если он определен как db2. Кроме того, если в SQLServer нет проблемы, вы можете опустить удаление и воссоздание зависимых объектов.

Поскольку вы указываете, что используете SQL Server, это изменение может и должно выполняться с помощью инструментов проектирования.

Запустите программу Management Studio и подключитесь к серверу. Затем откройте эту базу данных и найдите таблицу.

Щелкните правой кнопкой мыши на таблице и выберите «Дизайн», а затем в этом окне сделайте изменения.

Теперь у вас есть два варианта:

  1. Вы можете нажать кнопку «Сохранить», и MS SQL Server выполнит сценарий и выполнит необходимые изменения для вас
  2. или вы можете использовать кнопку «Сгенерировать сценарий изменения». В моей среде IDE эта кнопка является самой левой кнопкой на той же панели инструментов, что и кнопки ключа / ограничения (не та же панель инструментов, на которой есть кнопка «Сохранить»)

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

Проблема с изменением первичного ключа заключается в том, что все ссылки из других таблиц в этот первичный ключ необходимо сначала удалить, а затем воссоздать, а программа SQL Server Management Studio достаточно умна для генерации (по крайней мере, в 99% случаях) все SQL, в которых вы нуждаетесь, в правильном порядке.

Я думаю, что вы должны создать таблицу, которая имеет первичный ключ идентификатора int и использовать ваше поле varchar как уникальный альтернативный естественный ключ для вашей базы данных.

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

ИМХО

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

 SELECT * INTO your_table_name_backup FROM your_table_name_original 

Это автоматически создаст копию вашей таблицы с именем your_table_name_backup

Теперь вы можете изменить исходную таблицу (your_table_name_original ) с помощью drop и create.

После этого

 INSERT INTO your_table_name_original SELECT * FROM your_table_name_backup 

И там вы не теряете данные, а вводите новые типы полей таблицы или ограничения 🙂

Заметки:

Я добавляю, чтобы писать это, потому что никто не ссылается на то, что MSQLMS вызывает некоторые изменения при изменении таблиц без drop и create, которые вы можете видеть как красивое сообщение, выходящее, когда вы используете конструктор для изменения типа поля, например. Я не понимаю, почему они позволяют вам открывать конструктор и фактически редактировать типы полей, если в конце вы получите сообщение, подобное этой операции, не разрешено yadayadayada …

Если кто-нибудь знает более простой способ просто упомянуть об этом, надеюсь, что это поможет кому-то …

Общая идея изложена ниже. Не забудьте сначала создать резервную копию своей базы данных.

 ALTER TABLE tableName ADD tempColumn VARCHAR(5) UPDATE tableName SET tempColumn = pkColumn -- Do this for all constraints ALTER TABLE tableName DROP CONSTRAINT pkConstraint ALTER TABLE tableName DROP COLUMN pkColumn ALTER TABLE tableName ADD pkColumn VARCHAR(5) UPDATE tableName SET pkColumn = tempColumn ALTER TABLE tableName DROP COLUMN tempColumn 
  • Как предотвратить атаку SQL-инъекции на текстовое поле?
  • SQL Server - объединение двух таблиц на основе последней даты
  • SQL Server: sys.master_files vs. sys.database_files
  • Как заполнить столбец базы данных случайными числами
  • Как сортировать DbSet при сохранении асинхронности?
  • Синхронизация двух или более баз данных SQL Server 2012
  • База данных SQL VS. Несколько плоских файлов (Тысячи небольших CSV)
  • IF / ELSE в зависимости от результата хранимой процедуры
  • MSSQL-схема и Hibernate 5.1.0.Final (таблица не найдена)
  • Что такое mysql-эквивалент ошибки Sql Server @@ Identity и @@ и как использовать try catch в mysql
  • SQL Server Синхронизация данных между двумя базами данных
  • Interesting Posts

    Каков быстрый способ обновления 100 миллионов + записей?

    T-sql Inner Присоединиться к неустойчивому поведению

    Как заполнить окно Nulls для Lead, используя несколько критериев

    Как получить имена самых дорогих SP в SQL Server 2005/2008

    выполнение хранимой процедуры с параметром

    SQL-инъекция на классических страницах ASP с параметризованными запросами: текстовые поля

    SQL Server CSV для каждой строки

    Создание хранимой процедуры Синтаксис, касающийся использования GO

    Entity Framework – получить тип данных поля SQL Server

    Прерывистая ошибка в службе Windows: основной провайдер отказался от Open

    SQL 2005 Выберите данные, в которых выполняется преобразование

    SQL-запрос для множественной таблицы

    Почему SQL Server автоматически не конвертирует DATE в DATETIME для целей сравнения?

    Вычисление стоимости продаж по массовой вставке SQL

    sp_whoisactive приводит к неизвестному запросу: «Вставить Into <имя_таблицы>> выбрать *, %% bmk %% из <table_name> (maxdop 1)"

    Давайте будем гением компьютера.