我有这张桌子:
CREATE TABLE [dbo].[Word] (
[WordId] INT NOT NULL,
[Name] VARCHAR (20) NOT NULL,
[StatusId] INT DEFAULT ((1)) NULL,
[Syllables] VARCHAR (20) NULL,
[Ascii] AS (ascii([Name])) PERSISTED,
[CategoryId] INT DEFAULT ((1)) NOT NULL,
[GroupId] INT DEFAULT ((1)) NOT NULL,
[LessonId] INT DEFAULT ((1)) NOT NULL,
[CreatedBy] INT DEFAULT ((1)) NOT NULL,
[CreatedDate] DATETIME DEFAULT (getdate()) NOT NULL,
[ModifiedBy] INT DEFAULT ((1)) NOT NULL,
[ModifiedDate] DATETIME DEFAULT (getdate()) NOT NULL,
[Version] ROWVERSION NULL,
PRIMARY KEY CLUSTERED ([WordId] ASC),
CONSTRAINT [FK_WordLesson] FOREIGN KEY ([LessonId]) REFERENCES [dbo].[Lesson] ([LessonId]),
CONSTRAINT [FK_WordWordCategory] FOREIGN KEY ([CategoryId]) REFERENCES [dbo].[WordCategory] ([WordCategoryId]),
CONSTRAINT [FK_WordWordGroup] FOREIGN KEY ([GroupId]) REFERENCES [dbo].[WordGroup] ([WordGroupId])
);
GO
CREATE NONCLUSTERED INDEX [Word_Category_IX]
ON [dbo].[Word]([CategoryId] ASC);
GO
CREATE NONCLUSTERED INDEX [Word_Group_IX]
ON [dbo].[Word]([GroupId] ASC);
GO
CREATE NONCLUSTERED INDEX [Word_Lesson_IX]
ON [dbo].[Word]([LessonId] ASC);
如何将WordId的值更改为介于1和INT列最大值之间的随机数?
请注意,我知道随机数可能会被使用两次,但它是测试数据,所以我不太关心它。
答案 0 :(得分:1)
我建议采用与你目前正在走的路线不同的方法。
只需使用内置的标识列,因为此字段是主键,您需要确保不会重复。代码看起来像这样。
CREATE TABLE [dbo].[Word] (
[WordId] INT IDENTITY(1,1) NOT NULL,
它将为您提供一个以1开头的值,每次输入一行新数据时,该值将递增1.
此外,查看您的代码,您已将字段StatusId
视为可为空但具有默认值,您确定不希望将其作为NOT NULL
场?
有关信息,您可以使用此计算来获得小于给定int值的随机数;
DECLARE @RandomInt int; SET @RandomInt = 42
SELECT
@RandomInt Number
,ROUND(RAND()*@RandomInt,0) RandomLessThanInt
你会得到这样的答案;
Number RandomLessThanInt
42 15
每次运行都会发生变化。您必须确保该号码已经存在,否则您将尝试违反PK约束并且插入将失败。
如果您已经填充了数据表,那么您可以执行此操作
UPDATE TableName
SET FieldName = ROUND(RAND()*FieldName,0)