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

【原创】PostgreSQL 快速创建空表TIPS,第1张

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

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>createtablet2liket1;queryOK,0rowsaffected(0.03sec)


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

+----------+------------------+------+-----+---------+----------------+|FIEld|Type|Null|Key|Default|Extra|+----------+------------------+------+-----+---------+----------------+|ID|int(10)unsigned|NO|PRI|NulL|auto_increment||log_time|datetime(6)|YES||NulL||+----------+------------------+------+-----+---------+----------------+


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

MysqL>insertintot2(log_time)selectNow();queryOK,1rowaffected(0.00sec)Records:1Duplicates:0Warnings:0MysqL>select*fromt2;+----+----------------------------+|ID|log_time|+----+----------------------------+|1|2014-11-2713:44:12.000000|+----+----------------------------+1rowinset(0.00sec)


现在来看下Postgresql:

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

table"ytt_sql.t1"Column|Type|ModifIErs----------+-----------------------------+-------------------------------------------------ID|integer|notnulldefaultnextval('t1_ID_seq'::regclass)log_time|timestampwithouttimezone|Indexes:"t1_pkey"PRIMARYKEY,btree(ID)


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

t_girl=#createtablet2(liket1includingall);CREATEtableTime:50.035ms


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

table"ytt_sql.t2"Column|Type|ModifIErs----------+-----------------------------+-------------------------------------------------ID|integer|notnulldefaultnextval('t1_ID_seq'::regclass)log_time|timestampwithouttimezone|Indexes:"t2_pkey"PRIMARYKEY,btree(ID)



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

t_girl=#selectcurrval('t1_ID_seq');currval---------120(1row)Time:3.771ms

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

t_girl=#createsequencet2_ID_seq;CREATESEQUENCETime:12.744ms


更新这列的默认值。

t_girl=#altertablet2alterIDsetdefaultnextval('t2_ID_seq');ALTERtableTime:5.002ms


这时候插入些记录看看:

t_girl=#insertintot2(log_time)values....;INSERT010Time:10.331ms

这时记录从1开始了:

t_girl=#select*fromt2;ID|log_time----+----------------------------1|2014-03-0906:49:14.3939622|2005-12-3005:49:14.3939623|2014-05-1720:49:14.3939624|2004-06-1522:49:14.3939625|2010-06-1903:49:14.393962...10|2009-09-0723:49:14.393962(10rows)Time:4.958ms


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

t_girl=#createtablet2(liket1includingallexcludingdefaults);CREATEtableTime:40.292ms
table"ytt_sql.t2"Column|Type|ModifIErs----------+-----------------------------+-----------ID|integer|notnulllog_time|timestampwithouttimezone|Indexes:"t2_pkey"PRIMARYKEY,btree(ID)


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

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

t_girl=#createtablet2astablet1withnodata;SELECT0Time:15.562ms或者t_girl=#createtablet2asselect*fromt1wherefalse;SELECT0Time:14.181ms


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

t_girl=#altertablet2addconstraintpk_t2_IDprimarykey(ID),alterIDsetdefaultnextval('t2_ID_seq');ALTERtableTime:41.105ms

结构跟原来一样了。

table"ytt_sql.t2"Column|Type|ModifIErs----------+-----------------------------+-------------------------------------------------ID|integer|notnulldefaultnextval('t2_ID_seq'::regclass)log_time|timestampwithouttimezone|Indexes:"pk_t2_ID"PRIMARYKEY,btree(ID)
总结

以上是内存溢出为你收集整理的【原创】PostgreSQL 快速创建空表TIPS全部内容,希望文章能够帮你解决【原创】PostgreSQL 快速创建空表TIPS所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/1176486.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)

保存