如何将表的主键值更改为随机数?

时间:2016-06-23 07:40:32

标签: sql-server

我有这张桌子:

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列最大值之间的随机数?

请注意,我知道随机数可能会被使用两次,但它是测试数据,所以我不太关心它。

1 个答案:

答案 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)