在样本数据集中随机填充外键
Randomly Populating Foreign Key In Sample Data Set
我正在为新数据库生成测试数据,但在填充其中一个外键字段时遇到问题。我需要在 table (SurveyResponses
) 中创建相对较大数量 (1000) 的条目,该条目具有指向只有 6 个条目 (Surveys
) 的 table 的外键
数据库已经有一个 Schools
table 有几千条记录。为了争论起见,我们假设它看起来像这样
Schools
+----+-------------+
| Id | School Name |
+----+-------------+
| 1 | PS 1 |
| 2 | PS 2 |
| 3 | PS 3 |
| 4 | PS 4 |
| 5 | PS 5 |
+----+-------------+
我正在创建一个新的 Survey
table。它只有大约 3 行。
Survey
+----+-------------+
| Id | Col2 |
+----+-------------+
| 1 | 2014 Survey |
| 2 | 2015 Survey |
| 3 | 2016 Survey |
+----+-------------+
SurveyResponses
只是将学校与调查联系起来。
Survey Responses
+----+----------+----------+
| Id | SchoolId | SurveyId |
+----+----------+----------+
| 1 | 1 | 1 |
| 2 | 2 | 2 |
| 3 | 3 | 1 |
| 4 | 4 | 3 |
| 5 | 5 | 2 |
+----+----------+----------+
填充 SurveyId
字段是给我带来最大麻烦的事情。我可以随机 select 1000 所学校,但我还没有找到生成 1000 个随机 SurveyId 的方法。我一直在努力避免 while 循环,但也许这是唯一的选择?
我一直在使用 Red Gate SQL 数据生成器来生成我的一些测试数据,但在这种情况下,我真的很想了解如何使用原始 SQL .
这是一种方法,使用相关子查询获得与每所学校相关的随机调查:
select s.schoolid,
(select top 1 surveyid
from surveys
order by newid()
) as surveyid
from schools s;
注意:这似乎不起作用。 Here 是 SQL Fiddle 表示不工作。我很惊讶它不起作用,因为 newid()
应该是
编辑:
如果您知道调查 ID 没有间隔且从 1 开始,您可以这样做:
select 1 + abs(checksum(newid()) % 3) as surveyid
我确实检查过它是否有效。
编辑二:
这似乎是过于激进的优化(在我看来)。关联查询似乎可以解决问题。所以,这样的事情应该有效:
select s.schoolid,
(select top 1 surveyid
from surveys s2
where s2.surveyid = s.schoolid or s2.surveyid <> s.schoolid -- nonsensical condition to prevent over optimization
order by newid()
) as surveyid
from schools s;
Here 是 SQL Fiddle 证明这一点。
我正在为新数据库生成测试数据,但在填充其中一个外键字段时遇到问题。我需要在 table (SurveyResponses
) 中创建相对较大数量 (1000) 的条目,该条目具有指向只有 6 个条目 (Surveys
) 的 table 的外键
数据库已经有一个 Schools
table 有几千条记录。为了争论起见,我们假设它看起来像这样
Schools
+----+-------------+
| Id | School Name |
+----+-------------+
| 1 | PS 1 |
| 2 | PS 2 |
| 3 | PS 3 |
| 4 | PS 4 |
| 5 | PS 5 |
+----+-------------+
我正在创建一个新的 Survey
table。它只有大约 3 行。
Survey
+----+-------------+
| Id | Col2 |
+----+-------------+
| 1 | 2014 Survey |
| 2 | 2015 Survey |
| 3 | 2016 Survey |
+----+-------------+
SurveyResponses
只是将学校与调查联系起来。
Survey Responses
+----+----------+----------+
| Id | SchoolId | SurveyId |
+----+----------+----------+
| 1 | 1 | 1 |
| 2 | 2 | 2 |
| 3 | 3 | 1 |
| 4 | 4 | 3 |
| 5 | 5 | 2 |
+----+----------+----------+
填充 SurveyId
字段是给我带来最大麻烦的事情。我可以随机 select 1000 所学校,但我还没有找到生成 1000 个随机 SurveyId 的方法。我一直在努力避免 while 循环,但也许这是唯一的选择?
我一直在使用 Red Gate SQL 数据生成器来生成我的一些测试数据,但在这种情况下,我真的很想了解如何使用原始 SQL .
这是一种方法,使用相关子查询获得与每所学校相关的随机调查:
select s.schoolid,
(select top 1 surveyid
from surveys
order by newid()
) as surveyid
from schools s;
注意:这似乎不起作用。 Here 是 SQL Fiddle 表示不工作。我很惊讶它不起作用,因为 newid()
应该是
编辑:
如果您知道调查 ID 没有间隔且从 1 开始,您可以这样做:
select 1 + abs(checksum(newid()) % 3) as surveyid
我确实检查过它是否有效。
编辑二:
这似乎是过于激进的优化(在我看来)。关联查询似乎可以解决问题。所以,这样的事情应该有效:
select s.schoolid,
(select top 1 surveyid
from surveys s2
where s2.surveyid = s.schoolid or s2.surveyid <> s.schoolid -- nonsensical condition to prevent over optimization
order by newid()
) as surveyid
from schools s;
Here 是 SQL Fiddle 证明这一点。