Одна вещь, на которую нужно обратить внимание - это разбиение на страницы (я знаю, что это может произойти в SQL Server - возможно, то же самое в MySQL).
Первичные ключи физически упорядочены. Используя целое число с автоматическим добавлением, вы гарантируете, что каждый раз, когда вы вставляете, вы вставляете следующий номер вверх, поэтому нет необходимости переустанавливать ключи для db. Однако, если вы используете строки, вы можете вставить pk в середине других ключей для поддержания порядка pk. Этот процесс переупорядочения pks на вставке может стать дорогим.
Это правильный ответ:
ALTER TABLE MEN DROP COLUMN Lname
Но ... если CONSTRAINT
существует на COLUMN
, то сначала вы должны DROP
CONSTRAINT
, тогда вы будете способный DROP
к COLUMN
. Чтобы сбросить CONSTRAINT
, запустите:
ALTER TABLE MEN DROP CONSTRAINT {constraint_name_on_column_Lname}
Вопрос в том, можно ли удалить только столбец из несуществующей таблицы ;-)
BEGIN TRANSACTION
IF exists (SELECT * FROM sys.columns c
INNER JOIN sys.objects t ON (c.[object_id] = t.[object_id])
WHERE t.[object_id] = OBJECT_ID(N'[dbo].[MyTable]')
AND c.[name] = 'ColumnName')
BEGIN TRY
ALTER TABLE [dbo].[MyTable] DROP COLUMN ColumnName
END TRY
BEGIN CATCH
print 'FAILED!'
END CATCH
ELSE
BEGIN
SELECT ERROR_NUMBER() AS ErrorNumber;
print 'NO TABLE OR COLUMN FOUND !'
END
COMMIT
Если вы используете C # и столбец Identity равен int, создайте новый экземпляр int, не предоставляя ему никакого значения. Это сработало для меня.
[identity_column] = new int ()
Ваш пример прост и не требует каких-либо дополнительных изменений в таблице, но, вообще говоря, это не так тривиально.
Если на этот столбец ссылаются другие таблицы, вам необходимо выяснить, что делать с другими таблицами / столбцами. Одним из вариантов является удаление внешних ключей и сохранение ссылочных данных в других таблицах.
Другой вариант - найти все ссылающиеся столбцы и удалить их, если они больше не нужны.
В таких случаях реальной проблемой является поиск всех внешних ключей. Вы можете сделать это, запросив системные таблицы или используя сторонние инструменты, такие как ApexSQL Search (бесплатно) или Red Gate Tracker Dependency (премиум, но больше функций). Там целая ветка по внешним ключам здесь
Общий:
ALTER TABLE table_name DROP COLUMN column_name;
В вашем случае:
ALTER TABLE MEN DROP COLUMN Lname;
Чтобы добавить столбцы в существующую таблицу:
ALTER TABLE table_name
ADD
column_name DATATYPE NULL
Чтобы удалить столбцы в существующей таблице:
ALTER TABLE table_name
DROP COLUMN column_name
ALTER TABLE TABLE_NAME DROP COLUMN COLUMN_NAME;
Например,
изменить таблицу Адрес удаленного столбца сотрудника;
Это также можно сделать через графический интерфейс SSMS. Хорошая особенность этого метода в том, что он предупреждает вас о наличии каких-либо связей в этом столбце, а также может автоматически их удалять.
Как я уже говорил ранее, если есть какие-либо отношения, которые также должны быть удалены, в этот момент вас спросят, хотите ли вы удалить их. Вам, вероятно, потребуется сделать это, чтобы удалить столбец.
Простой ответ на это заключается в следующем:
ALTER TABLE MEN DROP COLUMN Lname;
Можно указать более одного столбца, например:
ALTER TABLE MEN DROP COLUMN Lname, secondcol, thirdcol;
В SQL Server 2016 также возможно только опустите столбец, если он существует. Это мешает вам получить ошибку за то, что вас, вероятно, не волнует.
ALTER TABLE MEN DROP COLUMN IF EXISTS Lname;
Есть некоторые предпосылки для удаления столбцов. Удаляемые столбцы не могут быть:
Если что-либо из вышеперечисленного является верным, вам нужно сначала удалить эти ассоциации.
Кроме того, следует отметить, что удаление столбца не освобождает пространство от жесткого диска до тех пор, пока кластерный индекс таблицы не будет перестроен. Поэтому часто рекомендуется следовать приведенному выше описанию с помощью команды перестроения таблицы, подобной этой:
ALTER TABLE MEN REBUILD;
Наконец, как некоторые говорили, это может быть медленным и, вероятно, заблокирует таблицу на время. Можно создать новую таблицу с желаемой структурой, а затем переименовать так:
SELECT
Fname
-- Note LName the column not wanted is not selected
INTO
new_MEN
FROM
MEN;
EXEC sp_rename 'MEN', 'old_MEN';
EXEC sp_rename 'new_MEN', 'MEN';
DROP TABLE old_MEN;
Но имейте в виду, что здесь есть окно для потери данных вставленных строк между первым выбором и последней командой переименования .
В SQL Server 2016 вы можете использовать новые операторы DIE.
ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name
Приведенный выше запрос может быть запущен повторно drops
для столбца, только если он exists
в таблице, иначе он не выдаст ошибку.
Вместо использования больших IF
оберток для проверки существования column
перед его удалением вы можете просто выполнить приведенное выше выражение DDL