首页 > 数据库技术 > 详细

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

时间:2014-12-10 02:28:05      阅读:314      评论:0      收藏:0      [点我收藏+]
MySQL 有一个和优秀的语法 create table ... like , 可以快速复制一张表,创建其副本。 PostgreSQL 也有类似的语法,而且更加灵活,不过要注意些细节。
先来看看MySQL 语法: create table ... like 
原始表T1,结构如下:

点击(此处)折叠或打开

  1. +----------+------------------+------+-----+---------+----------------+
  2. | Field | Type | Null | Key | Default | Extra |
  3. +----------+------------------+------+-----+---------+----------------+
  4. | id | int(10) unsigned | NO | PRI | NULL | auto_increment |
  5. | log_time | datetime(6) | YES | | NULL | |
  6. +




快速做一张副本:

点击(此处)折叠或打开

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



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

点击(此处)折叠或打开

  1. +----------+------------------+------+-----+---------+----------------+
  2. | Field | Type | Null | Key | Default | Extra |
  3. +----------+------------------+------+-----+---------+----------------+
  4. | id | int(10) unsigned | NO | PRI | NULL | auto_increment |
  5. | log_time | datetime(6) | YES | | NULL | |
  6. +----------+------------------+------+-----+---------+----------------+




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



点击(此处)折叠或打开

  1. mysql> insert into t2 (log_time) select now();
  2. Query OK, 1 row affected (0.00 sec)
  3. Records: 1 Duplicates: 0 Warnings: 0


  4. mysql> select * from t2;
  5. +----+----------------------------+
  6. | id | log_time |
  7. +----+----------------------------+
  8. | 1 | 2014-11-27 13:44:12.000000 |
  9. +----+----------------------------+
  10. 1 row in set (0.00 sec)






现在来看下PostgreSQL:
原始表结构如下, 包含了一个序列作为主键。


点击(此处)折叠或打开

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


点击(此处)折叠或打开

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




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

点击(此处)折叠或打开

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



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

点击(此处)折叠或打开

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





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

点击(此处)折叠或打开

  1. t_girl=# select currval(‘t1_id_seq‘);
  2.  currval
  3. ---------
  4.      120
  5. (1 row)


  6. Time: 3.771 ms



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

点击(此处)折叠或打开

  1. t_girl=# create sequence t2_id_seq;
  2. CREATE SEQUENCE
  3. Time: 12.744 ms



更新这列的默认值。

点击(此处)折叠或打开

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



这时候插入些记录看看:

点击(此处)折叠或打开

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




这时记录从1开始了:

点击(此处)折叠或打开

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


  12. Time: 4.958 ms




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



点击(此处)折叠或打开

  1. t_girl=# create table t2 (like t1 including all excluding defaults);
  2. CREATE TABLE
  3. Time: 40.292 ms




  4.                  Table "ytt_sql.t2"
  5.   Column | Type | Modifiers
  6. ----------+-----------------------------+-----------
  7.  id | integer | not null
  8.  log_time | timestamp without time zone |
  9. Indexes:
  10.     "t2_pkey" PRIMARY KEY, btree (id)



这里也可以不用LIKE 选项,直接用类似CREATE TABLE AS ...语法,如下:
创建没有记录的空表,但是这里只包含了表结构以及字段相关。



点击(此处)折叠或打开

  1. t_girl=# create table t2 as table t1 with no data;
  2. SELECT 0
  3. Time: 15.562 ms
  4. 或者
  5. t_girl=# create table t2 as select * from t1 where false;
  6. SELECT 0
  7. Time: 14.181 ms



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

点击(此处)折叠或打开

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




结构跟原来一样了。


点击(此处)折叠或打开

  1. Table "ytt_sql.t2"
  2.   Column | Type | Modifiers
  3. ----------+-----------------------------+-------------------------------------------------
  4.  id | integer | not null default nextval(‘t2_id_seq‘::regclass)
  5.  log_time | timestamp without time zone |
  6. Indexes:
  7.     "pk_t2_id" PRIMARY KEY, btree (id)



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

原文:http://blog.chinaunix.net/uid-259788-id-4679667.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!