Как изменить первичный ключ в базе данных SQL Server 2005 без потери каких-либо данных? - PullRequest
2 голосов
/ 14 мая 2009

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

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

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

Ответы [ 6 ]

1 голос
/ 14 мая 2009

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

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

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

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

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

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

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

1 голос
/ 14 мая 2009

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

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

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

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

1 голос
/ 14 мая 2009

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

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

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

0 голосов
/ 03 ноября 2011

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

SELECT *
INTO your_table_name_backup 
FROM your_table_name_original

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

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

После этого сделать

INSERT INTO your_table_name_original SELECT * FROM your_table_name_backup

И вы не потеряете данные и не добавите новые типы полей таблицы или ограничения:)

Примечания:

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

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

0 голосов
/ 14 мая 2009

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

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
0 голосов
/ 14 мая 2009

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

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

ИМХО

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...