SQL IDENTITY COLUMN

时间:2010-04-27 05:55:53

标签: sql sql-server identity-column

嘿伙计们我有一个sql表,基本上是一个声明。 现在要说我在表中的记录有一个日期和一个自动编号的标识列,并定义了事务在客户端的前端显示的顺序。 问题是在插入过程中,一些数据丢失了,两个日期之间的某些交易丢失了。

我需要将数据插入到表中,但是我需要在日期之间而不是在表的末尾插入它们。如果我现在正常插入,数据将出现在表的末尾而不是我指定的日期,因为标识列是自动编号的,无法更新。

由于

3 个答案:

答案 0 :(得分:3)

使用SET IDENTITY_INSERT (table) ON,强制SQL Server允许您将任意值插入IDENTITY列 - 但是无法更新 IDENTITY列。

无论如何,有一些差距是什么大问题?是的,这可能是一个“整容”的问题 - 但是你真的想要在化妆品问题上花多少麻烦和努力?条目的顺序仍然是给定的 - 即使有差距。

再说一次:有什么大不了的? IDENTITY列保证不断增加 - 这就是他们所保证的。对于99%的案例,这已经足够好了......

答案 1 :(得分:1)

为什么不在用户界面中显示按日期排序的记录,而不是主键?

好的,如果你真的想这样做(我个人认为,改变UI中的排序日期比更新数据库中的主键值要容易,但无论如何......)。这应该有效,假设您没有在任何外键约束中使用主键值(如果是,那么您需要确保这些约束设置为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

但是,强烈强烈建议您在尝试之前备份数据库。

答案 2 :(得分:0)

出于好奇,每个日期是一个身份证吗?您的回答意味着这一点,如果是这样,请将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