СТОЛБЦ ИДЕНТИФИКАЦИИ SQL

У меня есть таблица sql, которая в основном является оператором.

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

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

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


person andreas    schedule 27.04.2010    source источник
comment
Хорошо, попробовал, я установил для него SET IDENTITY_INSERT имя таблицы ON, но не могу обновить столбец идентификаторов, SQL сообщает мне, что он выключен (что странно, потому что я успешно завершаю команду, когда я устанавливаю для нее значение ON). Также попытка повторно заполнить таблицу не имеет никакого эффекта, хотя она сообщает мне, что она завершена. Права доступа имеют к этому какое-то отношение? у меня есть доступ к SA (чтение, запись, создание, обновление и т. д.).   -  person andreas    schedule 27.04.2010


Ответы (3)


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

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

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

person marc_s    schedule 27.04.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

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

person Dean Harding    schedule 27.04.2010
comment
это должно быть на уровне базы данных, так как внесение изменений в пользовательский интерфейс повлияет на множество других вещей, что сделает это долгим и дорогостоящим изменением. так что БД - единственный вариант - person andreas; 27.04.2010
comment
Есть ли пробел в значениях первичного ключа, или вам также придется обновлять все последующие? Кроме того, какой механизм базы данных вы используете (SQL Server, Oracle, MySQL и т. д.)? - person Dean Harding; 27.04.2010
comment
Это MS SQL. Нет, столбец идентификаторов продолжается как обычно. все строки отсутствуют, как будто они никогда не были вставлены. поэтому мне нужно добавить новые строки между существующими и перенумеровать их, чтобы пропавшие даты были в правильном порядке. поэтому я знаю, что у меня есть дата A, дата B, дата D, но отсутствует дата C. Поэтому C нужно добавить в правильном порядке и получить правильный идентификатор. - person andreas; 27.04.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
person Meff    schedule 29.04.2010