Изменение столбца TIMESTAMP с NULL на NOT NULL - PullRequest
0 голосов
/ 02 апреля 2019

У меня есть база данных MS-SQL с большим количеством таблиц, в которых есть столбец TIMESTAMP.Большинство из этих столбцов не обнуляемы, но некоторые из них таковы, поэтому я хотел изменить те, которые обнуляются, чтобы не обнуляться.от обнуляемости до не обнуляемости не работает

IF EXISTS (SELECT o.name FROM sysobjects o WHERE o.xtype='U' AND o.name='TableName')
BEGIN
    ALTER TABLE TableName ALTER COLUMN [Timestamp] TIMESTAMP NOT NULL
END

SQL-сервер говорит мне, что столбец Timestamp нельзя изменить на тип данных timestamp (что я не делаю).

Что-то не так с моим утверждением или столбец TIMESTAMP не может быть обнуляемым после его создания?Есть ли способ изменить обнуляемость столбца без указания его типа данных?Или мне действительно нужно полностью удалить столбец и воссоздать его снова?

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

Используется SQL-Server 2008 R2 и более поздние версии.

1 Ответ

2 голосов
/ 02 апреля 2019

Чтобы ответить на ваш вопрос (или, как мне кажется, ваш вопрос), timestamp является синонимом rowversion.Вы не можете изменить столбец на столбец timestamp / rowversion.Кроме того, столбец, объявленный как timestamp / rowversion, никогда не будет иметь значения NULL. DB <> Fiddle Цитировать документацию ( rowversion (Transact-SQL) - Замечания (фрагмент) ):

Каждый раз, когда строка сСтолбец rowversion изменяется или вставляется, в столбец rowversion вставляется увеличенное значение rowversion базы данных.

Если вам нужно добавить rowversion после создания таблицы, всем им будет присвоено значениедля rowversion тогда тоже. DB <> fiddle

Стоит также отметить, что rowversion устарело (цитируя вышеприведенную документацию):

Синтаксис метки времени устарел,Эта функция находится в режиме обслуживания и может быть удалена в будущей версии Microsoft SQL Server.Избегайте использования этой функции в новых разработках и планируйте модифицировать приложения, которые в настоящее время используют эту функцию.

Я подозреваю, что вы действительно после того, как здесь есть модифицированный столбец date(time), который является совершенно другимвещь.timestamp несмотря на имя, не имеет никакого отношения ко времени:

Тип данных rowversion является просто возрастающим числом и не сохраняет дату или время.Для записи даты или времени используйте тип данных datetime2.

Таким образом, как говорится в документации, используйте datetime2 (или другой тип данных даты (времени)).

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