SQL IDENTITY COLUMN - PullRequest
       8

SQL IDENTITY COLUMN

3 голосов
/ 27 апреля 2010

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

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

Спасибо

Ответы [ 3 ]

3 голосов
/ 27 апреля 2010

Используя SET IDENTITY_INSERT (table) ON, вы заставляете SQL Server вставлять любое произвольное значение в столбец IDENTITY, но нет способа обновить столбец IDENTITY.

В чем проблема с несколькими пробелами? Да, это может быть «косметической» проблемой, но сколько хлопот и усилий вы действительно хотите потратить на косметические проблемы? Порядок записей по-прежнему задан - даже с пробелами.

Итак, еще раз: в чем дело ?? Столбцы IDENTITY гарантированно будут постоянно расти - это все, что они гарантируют. И для 99% случаев этого более чем достаточно…

1 голос
/ 27 апреля 2010

Почему бы просто не отобразить записи в пользовательском интерфейсе, отсортированные по дате, а не по первичному ключу?

ОК, если вы действительно хотите это сделать (лично я думаю, что изменение даты сортировки в пользовательском интерфейсе будет проще, чем обновление значений первичного ключа в базе данных, но в любом случае ...). Это должно работать, при условии, что вы не используете значения первичного ключа в каких-либо ограничениях внешнего ключа (если это так, то вам нужно убедиться, что для этих ограничений установлено ON UPDATE CASCADE)

SET IDENTITY_INSERT tablename ON

UPDATE tablename SET
    primary_key = primay_key + 1
WHERE
    primary_key >= <the primary key where you want to insert the new date>

INSERT INTO tablename
    (primary_key, date, ...)
VALUES
    (<the primary key to insert>, <the date to insert>, ...)

SET IDENTITY_INSERT tablename OFF

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

0 голосов
/ 29 апреля 2010

Просто из любопытства, это один идентификатор на дату? Ваши ответы подразумевают это немного, поэтому, если это так, замените столбец Identity на вычисляемый столбец, который определяется как разница дат в днях от произвольной начальной точки?

DECLARE @EXAMPLE TABLE
(
    [Date] DATE,
    ID AS DATEDIFF(Day, '1 Jan 2010', [Date])
)

INSERT INTO @EXAMPLE([Date])
VALUES (GETDATE()), (GETDATE()+1), (GETDATE()+2)

SELECT * FROM @EXAMPLE
...