【原创】PostgreSQL 快速创建空表TIPS

MySQL 有一个和优秀的语法 create table ... like , 可以快速复制一张表,创建其副本。 PostgreSQL 也有类似的语法,而且更加灵活,不过要注意些细节。

先来看看MySQL 语法: create table ... like

原始表T1,结构如下:

+----------+------------------+------+-----+---------+----------------+
| Field    | Type             | Null | Key | Default | Extra          |
+----------+------------------+------+-----+---------+----------------+
| id       | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| log_time | datetime(6)      | YES  |     | NULL    |                |
+----------+------------------+------+-----+---------+----------------+

快速做一张副本:

mysql> create table t2 like t1;
Query OK, 0 rows affected (0.03 sec)

这时会有一张相同的副本表快速产生:

+----------+------------------+------+-----+---------+----------------+
| Field    | Type             | Null | Key | Default | Extra          |
+----------+------------------+------+-----+---------+----------------+
| id       | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| log_time | datetime(6)      | YES  |     | NULL    |                |
+----------+------------------+------+-----+---------+----------------+

这时注意到,这里用到自增字段作为主键,不过MySQL 这类语法不会沿用原始表的自增位置,还是从头开始。不过这点说起来难免搞笑,因为MySQL没有单独的序列。

mysql> insert into t2 (log_time) select now();
Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0
mysql> select * from t2;
+----+----------------------------+
| id | log_time                   |
+----+----------------------------+
|  1 | 2014-11-27 13:44:12.000000 |
+----+----------------------------+
1 row in set (0.00 sec)

现在来看下PostgreSQL:

原始表结构如下, 包含了一个序列作为主键。

                                    Table "ytt_sql.t1"
  Column  |            Type             |                    Modifiers                    
----------+-----------------------------+-------------------------------------------------
 id       | integer                     | not null default nextval(‘t1_id_seq‘::regclass)
 log_time | timestamp without time zone | 
Indexes:
    "t1_pkey" PRIMARY KEY, btree (id)

用类似的语法create table ... like 来创建副本:

t_girl=# create table t2 (like t1 including all);
CREATE TABLE
Time: 50.035 ms

副本的表结构如下,不过可能发现了一个问题,连同原始表的序列也一起弄过来了,这个太不安全了。

                                    Table "ytt_sql.t2"
  Column  |            Type             |                    Modifiers                    
----------+-----------------------------+-------------------------------------------------
 id       | integer                     | not null default nextval(‘t1_id_seq‘::regclass)
 log_time | timestamp without time zone | 
Indexes:
    "t2_pkey" PRIMARY KEY, btree (id)

而此时查看到这个序列的指针已经是120了,那么副本表的记录不是要从120开始?而且副本表的插入或者其他写入操作都会影响原始表!

t_girl=# select currval(‘t1_id_seq‘);          
 currval 
---------
     120
(1 row)
Time: 3.771 ms

所以这时重新创建一个新的序列给副本表专用:

t_girl=# create sequence t2_id_seq;
CREATE SEQUENCE
Time: 12.744 ms

更新这列的默认值。

t_girl=# alter table t2 alter id set default nextval(‘t2_id_seq‘);
ALTER TABLE
Time: 5.002 ms

这时候插入些记录看看:

t_girl=# insert into t2 (log_time) values ....;
INSERT 0 10
Time: 10.331 ms

这时记录从1开始了:

t_girl=# select * from t2;
 id |          log_time          
----+----------------------------
  1 | 2014-03-09 06:49:14.393962
  2 | 2005-12-30 05:49:14.393962
  3 | 2014-05-17 20:49:14.393962
  4 | 2004-06-15 22:49:14.393962
  5 | 2010-06-19 03:49:14.393962
...
 10 | 2009-09-07 23:49:14.393962
(10 rows)
Time: 4.958 ms

不过我这里LIKE了所有选项,也可以不不包括默认值,这样,序列本身就不会复制进来了。

t_girl=# create table t2 (like t1 including all excluding defaults);
CREATE TABLE
Time: 40.292 ms
                 Table "ytt_sql.t2"
  Column  |            Type             | Modifiers 
----------+-----------------------------+-----------
 id       | integer                     | not null
 log_time | timestamp without time zone | 
Indexes:
    "t2_pkey" PRIMARY KEY, btree (id)

这里也可以不用LIKE 选项,直接用类似CREATE TABLE AS ...语法,如下:

创建没有记录的空表,但是这里只包含了表结构以及字段相关。

t_girl=# create table t2 as table t1 with no data;
SELECT 0
Time: 15.562 ms
或者
t_girl=# create table t2 as select * from t1 where false;
SELECT 0
Time: 14.181 ms

我们手动给添加主键以及默认值。

t_girl=# alter table t2 add constraint pk_t2_id primary key (id), alter id set default nextval(‘t2_id_seq‘);
ALTER TABLE
Time: 41.105 ms

结构跟原来一样了。

                                    Table "ytt_sql.t2"
  Column  |            Type             |                    Modifiers                    
----------+-----------------------------+-------------------------------------------------
 id       | integer                     | not null default nextval(‘t2_id_seq‘::regclass)
 log_time | timestamp without time zone | 
Indexes:
    "pk_t2_id" PRIMARY KEY, btree (id)
时间: 2024-10-13 07:06:42

【原创】PostgreSQL 快速创建空表TIPS的相关文章

PostgreSQL 快速创建空表TIPS

MySQL 有一个和优秀的语法 create table ... like , 可以快速复制一张表,创建其副本. PostgreSQL 也有类似的语法,而且更加灵活,不过要注意些细节.先来看看MySQL 语法: create table ... like 原始表T1,结构如下: +----------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default

【原创】关于oracle11G空表无法导出问题的解决方法

在网上搜索了相关资料后,结合自己的实际情况,总结了一下解决方法,具体如下: 1.先批量分析统计各表总记录数: --批量分析统计表记录总数 begin for obj in (select 'analyze table '||table_name|| ' compute statistics ' sqlstr from user_tables) loop --in里面的select无分号 execute immediate obj.sqlstr; end loop; end; 2.再批量分配ext

PostgreSQL的创建表

PostgreSQL的CREATE TABLE语句是用来在任何指定的的数据库中创建一个新表. 语法 CREATE TABLE语句的基本语法如下: CREATE TABLE table_name( column1 datatype, column2 datatype, column3 datatype, ..... columnN datatype, PRIMARY KEY( one or more columns ) ); CREATE TABLE是告诉数据库系统关键字,创建一个新的表.独特的名

关于度量快速开发平台(创建数据表,业务表)

转眼之间,我已在度量工作了20天,在这20天中,不多不少,有些收获. 前十天,在无尽的学习当中,熟悉快速开放平台,看文档,听同事讲解之后,做练习,十天下来, 对于这个平台已熟悉的差不多了,我不得不说这个平台的强大.一.平台简介 快速开发平台主要分为两种模式.一种是引擎模式,一种是生成源代码模式.在度量快速开发平台中,这两种模式都使用到了,但是生成源代码模式在度量快速开发平台里面得到了不一样的体现,更大幅度的提高了效率. 我们在平台中不管用什么方式构建(在平台中开发我们称之为构建)出来的应用(在平

postgreSQL 创建user表时引发的表名大写与双引号问题

在postgreSQL里面,user是一个保留字. 如果你想创建user表,你可能会遭遇一些问题! 如图: 可以看到,这里是无法创建user表的. 你可能会说,我只是没有加双引号""来括住大写的表名而已,没错! 当我用""括住大写的表名的时候,问题解决了! 如图: 但是,事情还没完! 如果我不是创建user表,而是其他的,如Useless表呢? 如图: 会看到Useless表是可以创建的,只不过这里表名被自动转换为了小写. 这里应该是遵循了标准SQL的规定. 如果我

【原创】文本工具的使用--根据数据库字段快速生成该表对应的Model类属性

在实际项目开发过程中,我们会经常碰到这样的问题:数据库表的字段按下划线命名方式都设计好了,接下来是要创建该表对应的Model类.如果我们按照数据库表中的字段,再手动敲一遍,生成对应Model类的属性.在字段少的情况下,手动创建Model类似乎没啥的.要是字段比较多,那就有点费时了.那如何快速生成数据库表字段对应的Model类呢?以下是本人的解决方案: 1.将建表语句复制到文本编辑器,如notepad++,editplus,vim等. 2.剔除其他字符串,提取字段 点击全部替换 3.下划线法转驼峰

使用PHP快速创建现代化的form表单,支持前端js扩展,就是方便

form-builder 使用PHP快速创建现代化的form表单,包含复选框.单选框.输入框.下拉选择框等元素以及,省市区三级联动,时间选择,日期选择,颜色选择,文件/图片上传等功能. 详细查看: Github地址 | Composer地址 表单使用form-create js表单生成器生成 如果对您有帮助,您可以在Github点右上角 "Star" 支持一下 谢谢! 本项目还在不断开发完善中,如有建议或问题请在这里提出 安装 composer require xaboy/form-b

让你提前知道软件开发(27):创建数据库表和索引

文章2部分 数据库SQL语言 数据库表及索引的创建         数据表(或称表),是数据库最重要的组成部分之中的一个.数据库仅仅是一个框架.数据表才是事实上质的内容.举个样例来说,数据库就像是一座空旷的房子.而数据表是里面的家具,没有家具的房子仅仅是一个空壳而已.依据信息的分类情况,一个数据库中可能包括若干个不同用途的数据表. 表结构有简单.有复杂,这就对开发者提出了要求. 怎样设计一个表的字段才是最好的?表的字段怎样命名?怎样定义表字段的类型?怎样建立索引?等等. 1. 改动之前的建表脚本

.net使用SqlBulkCopy导入数据(创建新表)

原文:.net使用SqlBulkCopy导入数据(创建新表) .net2.0后ado.net提供了一个快速导入sqlserver的方法sqlbulkcopy.导入效率非常高. 包装了一个简单的sqlbulkcopy类,用于数据从datatable导入到sqlserver.代码如下: /// <summary> /// 将DataTable写入数据库的表中 /// </summary> /// <param name="source">数据源DataT