为有关系的几个表生成假数据

H. *_*lyn 5 sql-server insert random relations

我有 3 个表,我想在其中生成UsersCategoryLink.

如何在表中插入包含表UserCategoryLinkUserID随机用户和表中User随机 id 的列Categories。在这个SQL 小提琴中,您可以看到带有一些值的表。

  • UsersCategoryLink 必须填充随机用户和类别。
  • 每个用户必须有两个类别。
  • UserIDCategoryID是主键,所以每个值都必须是唯一的。
  • 我正在使用 SQL Server Express。

一些信息的表格和关系我想要什么

Han*_*non 7

这是我的交叉引用表版本,您将在其中存储用户及其所属的类别。请注意,有一个主键聚集索引(UserID, CategoryID);这确保每一行都是唯一的:

CREATE TABLE dbo.XREFUserCategories
(
    UserID INT NOT NULL
        CONSTRAINT FK_XREFUserCategories_UserID
        FOREIGN KEY 
        REFERENCES dbo.Users(UserID)
    , CategoryID INT NOT NULL
        CONSTRAINT FK_XREFUserCategories_CategoryID
        FOREIGN KEY 
        REFERENCES dbo.Categories(CategoryID)
    , CONSTRAINT PK_XREFUserCategories
        PRIMARY KEY CLUSTERED (UserID, CategoryID)
);
GO
Run Code Online (Sandbox Code Playgroud)

由于您已经在UsersCategories表中拥有数据,因此您可以使用带有ROW_NUMBER窗口函数的 CTE,其划分UserID排序基本上是随机值,NEWID()。这允许我们为每个“用户”精确选择两个“类别”:

;WITH rs AS 
(
    SELECT u.UserID
        , c.CategoryID
        , rn = ROW_NUMBER() OVER (
            PARTITION BY u.UserID 
            ORDER BY NEWID()
    )
    FROM dbo.Users u
        , dbo.Categories c
)
INSERT INTO dbo.XREFUserCategories(UserID, CategoryID)
SELECT rs.UserID
    , rs.CategoryID
FROM rs
WHERE rs.rn <= 2;
Run Code Online (Sandbox Code Playgroud)

以下是我在系统上生成的行示例:

在此处输入图片说明