首页 数据库 mysql教程 【原创】PostgreSQL快速创建空表TIPS

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

Jun 07, 2016 pm 02:55 PM
postgresql 创建 原创 快速 空表

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> 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)
登录后复制


本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1664
14
CakePHP 教程
1421
52
Laravel 教程
1315
25
PHP教程
1266
29
C# 教程
1239
24
如何在真我手机上创建文件夹? 如何在真我手机上创建文件夹? Mar 23, 2024 pm 02:30 PM

标题:真我手机新手指南:如何在真我手机上创建文件夹?在当今社会,手机已经成为人们生活中必不可少的工具。而真我手机作为一款备受欢迎的智能手机品牌,其简洁、实用的操作系统备受用户喜爱。在使用真我手机的过程中,很多人可能会遇到需要整理手机中的文件和应用的情况,而创建文件夹就是一种有效的方式。本文将介绍如何在真我手机上创建文件夹,帮助用户更好地管理自己的手机内容。第

如何在GIMP中创建像素艺术 如何在GIMP中创建像素艺术 Feb 19, 2024 pm 03:24 PM

本文将引起您的兴趣,如果您有意在Windows上使用GIMP进行像素艺术创作。GIMP是一款著名的图形编辑软件,不仅免费开源,还能帮助用户轻松创建出美丽的图像和设计。除了适用于初学者和专业设计师外,GIMP也可以用于制作像素艺术,这种数字艺术形式是利用像素作为唯一构建块来进行绘制和创作的。如何在GIMP中创建像素艺术以下是在WindowsPC上使用GIMP创建像素图片的主要步骤:下载并安装GIMP,然后启动应用程序。创建一个新的形象。调整宽度和高度的大小。选择铅笔工具。将笔刷类型设置为像素。设置

格力+如何创建家庭 格力+如何创建家庭 Mar 01, 2024 pm 12:40 PM

很多朋友表示想知道在格力+软件里该怎么去创建家庭,下面为大家带来了操作方法,想要了解的朋友和我一起来看看吧。首先,打开手机上的格力+软件,并登录。接着,在页面底部的选项栏中,点击最右边的“我的”选项,即可进入个人账户页面。2.来到我的页面后,在“家庭”下方的选项里有一个“创建家庭”,找到后在它的上面点击进入。3.接下来跳转到创建家庭的页面里,根据提示在输入框里输入要设置的家庭名称,输入好后在右上角点击“保存”按钮。4.最后在页面下方会弹出一个“保存成功”的提示,代表家庭已经成功创建好了。

如何创建您的 iPhone 联系人海报 如何创建您的 iPhone 联系人海报 Mar 02, 2024 am 11:30 AM

在iOS17中,Apple为其常用的“电话”和“通讯录”应用程序新增了联系人海报功能。这一功能允许用户为每个联系人设置个性化的海报,使通讯录更具可视化和个性化。联系人海报可以帮助用户更快速地识别和定位特定联系人,提高了用户体验。通过这一功能,用户可以根据自己的喜好和需求,为每个联系人添加特定的图片或标识,使通讯录界面更加生动iOS17中的Apple为iPhone用户提供了一种新颖的方式来表达自己,并添加了可个性化的联系海报。联系人海报功能允许您在呼叫其他iPhone用户时展示独特的个性化内容。您

如何使用Highcharts创建甘特图表 如何使用Highcharts创建甘特图表 Dec 17, 2023 pm 07:23 PM

如何使用Highcharts创建甘特图表,需要具体代码示例引言:甘特图是一种常用于展示项目进度和时间管理的图表形式,能够直观地展示任务的开始时间、结束时间和进度。Highcharts是一款功能强大的JavaScript图表库,提供了丰富的图表类型和灵活的配置选项。本文将介绍如何使用Highcharts创建甘特图表,并给出具体的代码示例。一、Highchart

Django初探:用命令行创建你的首个Django项目 Django初探:用命令行创建你的首个Django项目 Feb 19, 2024 am 09:56 AM

Django项目开启之旅:从命令行开始,创建你的第一个Django项目Django是一个强大而又灵活的Web应用框架,它以Python为基础,提供了许多开发Web应用所需的工具和功能。本文将带领你从命令行开始,创建你的第一个Django项目。在开始之前,请确保你已经安装了Python和Django。步骤一:创建项目目录首先,打开命令行窗口,并创建一个新的目录

理解SpringBoot和SpringMVC之间的差异及比较 理解SpringBoot和SpringMVC之间的差异及比较 Dec 29, 2023 am 09:20 AM

对比SpringBoot与SpringMVC,了解它们的差异随着Java开发的不断发展,Spring框架已经成为了许多开发人员和企业的首选。在Spring的生态系统中,SpringBoot和SpringMVC是两个非常重要的组件。虽然它们都是基于Spring框架的,但在功能和使用方式上却有一些区别。本文将重点对比一下SpringBoot与Sprin

Win11系统中'我的电脑”路径有何不同?快速查找方法! Win11系统中'我的电脑”路径有何不同?快速查找方法! Mar 29, 2024 pm 12:33 PM

Win11系统中“我的电脑”路径有何不同?快速查找方法!随着Windows系统的不断更新,最新的Windows11系统也带来了一些新的变化和功能。其中一个常见的问题是用户在Win11系统中找不到“我的电脑”的路径,这在之前的Windows系统中通常是很简单的操作。本文将介绍Win11系统中“我的电脑”的路径有何不同,以及快速查找的方法。在Windows1

See all articles