如何使用SQL为电话号码种子数据库表?

时间:2015-03-21 23:43:32

标签: sql postgresql

我在postgres数据库中有一个表格,用于存储格式为:12223334444的电话号码(作为varchar)。

据我所知,我将使用美国电话号码,但我认为用所有可能要求的电话号码预先填充数据库是个好主意。也就是说,所有数字都来自11_111_111_11119_999_999_999

现在我通过使用应用程序代码来实现这一目标,这需要很长时间。

假设我有一个名为phones的表和一个名为digits的列,是否有办法使用SQL填充数据库?

谢谢!

2 个答案:

答案 0 :(得分:2)

这是一个坏主意。

select 19999999999 - 11111111111;
8888888888

这大约有89亿个电话号码。除非你绝对必须,否则不要建造那么大的桌子。表格严重影响事务日志,索引大小,备份大小和完成时间等

但是,如果你需要为PostgreSQL生成和加载大量这样的数据,有两种明智的方法可以做到。

步骤取决于您是使用PostgreSQL还是使用应用程序代码生成数据。

对于PostgreSQL,在事务中,

  • 删除所有索引和约束,
  • 生成并插入数据
  • 创建所有索引和约束,
  • 提交交易。

如果你一次提交10k行,那么插入大量数据要快得多。实验。如果您这样做,则需要在上述步骤中调整事务边界。 (这些步骤中的每一步都成为一个或多个交易。)

如果您使用应用程序代码,通常最快

  • 使用应用程序代码
  • 生成csv文件
  • 删除所有索引和约束,
  • 使用COPY加载csv文件,
  • 创建所有索引和约束。

答案 1 :(得分:1)

这是一个疯狂的问题,但是postgres有一个答案

SELECT generate_series(1,19999999999)

这将创建一个包含1到19999999999之间所有数字的表

 INSERT INTO phone_table(phone number) 
 SELECT LPAD(g::VARCHAR(12),10,'0') FROM generate_series(1,19999999999) AS g;

这仍然需要很长时间,但它可能比应用程序代码更快。