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

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
如何向新的MySQL用户授予权限如何向新的MySQL用户授予权限May 09, 2025 am 12:16 AM

TograntpermissionstonewMySQLusers,followthesesteps:1)AccessMySQLasauserwithsufficientprivileges,2)CreateanewuserwiththeCREATEUSERcommand,3)UsetheGRANTcommandtospecifypermissionslikeSELECT,INSERT,UPDATE,orALLPRIVILEGESonspecificdatabasesortables,and4)

如何在MySQL中添加用户:逐步指南如何在MySQL中添加用户:逐步指南May 09, 2025 am 12:14 AM

toadduserInmysqleffectection andsecrely,theTheSepsps:1)USEtheCreateuserStattoDaneWuser,指定thehostandastrongpassword.2)GrantNectalRevileSaryPrivilegesSustate,usiveleanttatement,AdheringTotheTeprinciplelastPrevilegege.3)

mysql:添加具有复杂权限的新用户mysql:添加具有复杂权限的新用户May 09, 2025 am 12:09 AM

toaddanewuserwithcomplexpermissionsinmysql,loldtheSesteps:1)创建eTheEserWithCreateuser'newuser'newuser'@''localhost'Indedify'pa ssword';。2)GrantreadAccesstoalltablesin'mydatabase'withGrantSelectOnMyDatabase.to'newuser'@'localhost';。3)GrantWriteAccessto'

mysql:字符串数据类型和coltrationsmysql:字符串数据类型和coltrationsMay 09, 2025 am 12:08 AM

MySQL中的字符串数据类型包括CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT,排序规则(Collations)决定了字符串的比较和排序方式。1.CHAR适合固定长度字符串,VARCHAR适合可变长度字符串。2.BINARY和VARBINARY用于二进制数据,BLOB和TEXT用于大对象数据。3.排序规则如utf8mb4_unicode_ci忽略大小写,适合用户名;utf8mb4_bin区分大小写,适合需要精确比较的字段。

MySQL:我应该在Varchars上使用什么长度?MySQL:我应该在Varchars上使用什么长度?May 09, 2025 am 12:06 AM

最佳的MySQLVARCHAR列长度选择应基于数据分析、考虑未来增长、评估性能影响及字符集需求。1)分析数据以确定典型长度;2)预留未来扩展空间;3)注意大长度对性能的影响;4)考虑字符集对存储的影响。通过这些步骤,可以优化数据库的效率和扩展性。

mysql blob:有什么限制吗?mysql blob:有什么限制吗?May 08, 2025 am 12:22 AM

mysqlblobshavelimits:tinyblob(255bytes),blob(65,535 bytes),中间布洛布(16,777,215个比例),andlongblob(4,294,967,967,295 bytes).tousebl观察性:1)考虑performance impactsandSandStorelargeblobsextern; 2)管理backbackupsandreplication carecration; 3)usepathsinst

MySQL:自动化用户创建的最佳工具是什么?MySQL:自动化用户创建的最佳工具是什么?May 08, 2025 am 12:22 AM

自动化在MySQL中创建用户的最佳工具和技术包括:1.MySQLWorkbench,适用于小型到中型环境,易于使用但资源消耗大;2.Ansible,适用于多服务器环境,简单但学习曲线陡峭;3.自定义Python脚本,灵活但需确保脚本安全性;4.Puppet和Chef,适用于大规模环境,复杂但可扩展。选择时需考虑规模、学习曲线和集成需求。

mysql:我可以在斑点内搜索吗?mysql:我可以在斑点内搜索吗?May 08, 2025 am 12:20 AM

是的,YouCansearchInIdeAblobInMysqlusingsPecificteChniques.1)转换theblobtoautf-8StringWithConvertFunctionWithConvertFunctionandSearchusiseLike.2)forCompresseBlyblobs,useuncompresseblobs,useuncompressbeforeconversion.3)acpperformance impperformance imperformance imptactsanddataEccoding.4)

See all articles

热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

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

热工具

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

Atom编辑器mac版下载

Atom编辑器mac版下载

最流行的的开源编辑器

VSCode Windows 64位 下载

VSCode Windows 64位 下载

微软推出的免费、功能强大的一款IDE编辑器

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

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