嘿伙计们我有一个sql表,基本上是一个声明。 现在要说我在表中的记录有一个日期和一个自动编号的标识列,并定义了事务在客户端的前端显示的顺序。 问题是在插入过程中,一些数据丢失了,两个日期之间的某些交易丢失了。
我需要将数据插入到表中,但是我需要在日期之间而不是在表的末尾插入它们。如果我现在正常插入,数据将出现在表的末尾而不是我指定的日期,因为标识列是自动编号的,无法更新。
由于
答案 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