postgresql----根据现有表创建新表

除普通的建表语句"create table table_name(columns);"之外,还可以根据现有表快速的创建新表:

一.使用create table ... (like ...)创建一个和原表结构相同的新表,根据INCLUDING保留原表的约束,索引等。

create table table_name (like parent_table {INCLUDING|EXCLUDING}{DEFAULTS|CONSTRAINTS|INDEXES|STORAGE|COMMENTS|ALL});

直接使用LIKE不使用INCLUDING,新表只保留原表的表结构和NOT NULL约束,但是使用INCLUDING CONSTRAINTS配置会保留了主键,唯一键,CHECK约束,并不会保留外键约束。

示例:

1.创建示例表

test=# create table tbl_inherits_test (a int not null);
CREATE TABLE
test=# alter table tbl_inherits_test add constraint pk_tbl_inherits_test_a primary key(a);
ALTER TABLEtest=# create table tbl_inherits_parent(
 a int not null,
 b varchar(32) not null default ‘got u‘,
 c int,
 d date);

test=# alter table tbl_inherits_parent add constraint pk_tbl_inherits_parent_a primary key(a);
ALTER TABLE
test=# alter table tbl_inherits_parent add constraint fk_tbl_inherits_parent_a foreign key(a) references tbl_inherits_test(a);
ALTER TABLE
test=# alter table tbl_inherits_parent add constraint ck_tbl_inherits_parent_c check (c>10);
ALTER TABLE
test=# alter table tbl_inherits_parent add constraint uk_tbl_inherits_parent_b_d unique (b,d);
ALTER TABLE

test=# create index idx_tbl_inherits_parent_d on tbl_inherits_parent using btree (d);
  CREATE INDEX

2.使用LIKE创建表

test=# create table tbl_inherits_partition (like tbl_inherits_parent including constraints including indexes including defaults);
CREATE TABLE

test=# \d tbl_inherits_parent
                      Table "public.tbl_inherits_parent"
 Column |         Type          |                  Modifiers
--------+-----------------------+---------------------------------------------
 a      | integer               | not null
 b      | character varying(32) | not null default ‘got u‘::character varying
 c      | integer               |
 d      | date                  |
Indexes:
    "pk_tbl_inherits_parent_a" PRIMARY KEY, btree (a)
    "uk_tbl_inherits_parent_b_d" UNIQUE CONSTRAINT, btree (b, d)
    "idx_tbl_inherits_parent_d" btree (d)
Check constraints:
    "ck_tbl_inherits_parent_c" CHECK (c > 10)
Foreign-key constraints:
    "fk_tbl_inherits_parent_a" FOREIGN KEY (a) REFERENCES tbl_inherits_test(a)

test=# \d tbl_inherits_partition
                    Table "public.tbl_inherits_partition"
 Column |         Type          |                  Modifiers
--------+-----------------------+---------------------------------------------
 a      | integer               | not null
 b      | character varying(32) | not null default ‘got u‘::character varying
 c      | integer               |
 d      | date                  |
Indexes:
    "tbl_inherits_partition_pkey" PRIMARY KEY, btree (a)
    "tbl_inherits_partition_b_d_key" UNIQUE CONSTRAINT, btree (b, d)
    "tbl_inherits_partition_d_idx" btree (d)
Check constraints:
    "ck_tbl_inherits_parent_c" CHECK (c > 10)

二、使用create table ... as table ... with {data|no data}创建一个和原表结构相同的新表,保留或不保留数据,但是不会继承原表的约束,索引等。

test=# insert into tbl_inherits_test values (1);
INSERT 0 1
test=# insert into tbl_inherits_parent (a,b,c,d) values(1,‘sss‘,12,‘2016-06-22 17:00:00‘);
INSERT 0 1
test=#
test=# create table tbl_inherits_partition1 as table tbl_inherits_parent with data;
SELECT 1
test=# select * from tbl_inherits_partition1 ;
 a |  b  | c  |     d
---+-----+----+------------
 1 | sss | 12 | 2016-06-22
(1 row)

test=# \d tbl_inherits_partition1
   Table "public.tbl_inherits_partition1"
 Column |         Type          | Modifiers
--------+-----------------------+-----------
 a      | integer               |
 b      | character varying(32) |
 c      | integer               |
 d      | date                  | 

test=#
test=#
test=# create table tbl_inherits_partition2 as table tbl_inherits_parent with no data;
SELECT 0
test=# \d tbl_inherits_partition2
   Table "public.tbl_inherits_partition2"
 Column |         Type          | Modifiers
--------+-----------------------+-----------
 a      | integer               |
 b      | character varying(32) |
 c      | integer               |
 d      | date                  | 

test=# select * from tbl_inherits_partition2;
 a | b | c | d
---+---+---+---
(0 rows)

test=# 

三、使用select * into new_table from table将结果集保存在新表中,但是只能执行一次。

test=# select * into tbl_inherits_partition3 from tbl_inherits_parent ;
SELECT 1
test=# \d tbl_inherits_partition3
   Table "public.tbl_inherits_partition3"
 Column |         Type          | Modifiers
--------+-----------------------+-----------
 a      | integer               |
 b      | character varying(32) |
 c      | integer               |
 d      | date                  | 

test=# select * from tbl_inherits_partition3 ;
 a |  b  | c  |     d
---+-----+----+------------
 1 | sss | 12 | 2016-06-22
(1 row)

四、使用create table new_table as select * from table将结果集保存在新表中。

test=# create table tbl_inherits_partition4 as select * from tbl_inherits_parent ;
SELECT 1
test=# \d tbl_inherits_partition4
   Table "public.tbl_inherits_partition4"
 Column |         Type          | Modifiers
--------+-----------------------+-----------
 a      | integer               |
 b      | character varying(32) |
 c      | integer               |
 d      | date                  | 

test=# select * from tbl_inherits_partition4 ;
 a |  b  | c  |     d
---+-----+----+------------
 1 | sss | 12 | 2016-06-22
(1 row)
时间: 2024-12-21 23:33:11

postgresql----根据现有表创建新表的相关文章

Sql中根据旧表创建新表的SQL语句

今天在网上查了下,根据旧表创建新表的SQL语句,网上给了两个答案 create table tab_new like tab_old (使用旧表创建新表) create table tab_new as select col1,col2- from tab_old definition only 两个语句都试了一下,报错了. 正确的方法是 select * into newtable from oldtable; 如果不想导记录,只想生成表结构 :select * into newtable f

数据库SQL Server2012笔记(四)——多表查询、子查询、分页查询、用查询结果创建新表和外连接

1.多表查询 1)笛卡尔集: select  *  from  表名1,表名2 select  *  from  表名1,表名2  where   表名1.字段名=表名2.字段名 注: 若有两张表有相同名字的字段,则使用时需带表名(别名). order  by  置于where 条件之后. 2)自连接:同一张表的连接查询,将一张表视为两张表或多张表. eg:显示公司每个员工名字和他的上级的名字.将emp表看做两张表worker和boss select  worker.ename  雇员,boss

MySQL创建临时表-旧表建新表

1.创建临时表 临时表是一张表,用来临时保存一些数据 特点: 只对创建该临时表的用户可见: 当会话结束时,MySQL自动删除临时表. 临时表的核心:建表和删表消耗资源极其少 创建临时表的基本格式: CREATE TEMPORARY TABLE  tbl_name(--); ①创建的临时表在当前会话,正常使用 ②断开连接,再重新连接后执行查询,抛出异常: 错误代码: 1146 Table 'db_name.temtbl_name' doesn't exist.//该临时表在会话结束的时候被系统删除

php大力力 [023节]CREATE TABLE创建新表sql写字段备注(2015-08-27)

2015-08-27 php大力力023.CREATE TABLE创建新表sql写字段备注 http://www.cnblogs.com/dalitongxue/p/4762182.html 参考: MySQL字段的说明和备注信息 http://blog.csdn.net/chelen_jak/article/details/45689139 DROP TABLE IF EXISTS test_table; CREATE TABLE test_table( Test_ID int NOT NUL

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

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

使用INTO子句创建新表

例子 USE StudentManagement GO SELECT Student_No,Student_Name,Student_Sex INTO #StudentTemp FROM Student GO SELECT *FROM #StudentTemp GO INTO子句可以自动创建一个新表并将查询结果集中的记录添加到该表中.新表的列由select子句中的目标列来决定.若新表名称已#开头,如上所示,则声成的新表为临时表,不带#的为永久表. 使用INTO子句创建新表

PostgreSQL对现有的未来的表和视图授权给用户

由于开发提出需求: (1)在多个PostgreSQL的instacne上面创建一个readonly用户,仅对数据库里面的表或者视图(包括物化视图)有仅有select权限,并且对以后新建的表和视图也要有select权限,我们知道PostgreSQL 在schema下新建的表,对于一个已经存在的用户不会自动赋予select的权限的,需要我们使用grant select...手动去执行,这样就比较麻烦,总不能每次新建表,我们就赋权一次,要知道我们有很多实例,总不能把时间都放在这样没有意义的事情上,再说

2.3 PostgreSQL 创建新表

你可以通过声明表的名字和所有字段的名字及其类型来创建表: CREATE TABLE weather ( city varchar(80), temp_lo int, -- 最低气温 temp_hi int, -- 最高气温 prcp real, -- 降水量 date date ); 你可以在 psql 里连换行符一起键入这些东西.psql 可以识别该命令直到分号才结束. 你可以在 SQL 命令中自由使用空白(空格/tab/换行符).这意味着你可以用和上面不同的对齐方式(甚至在同一行中)键入命令

mysql 每个月创建新表

1.CREATE DEFINER=`root`@`%` PROCEDURE `aa`()BEGIN SET @sqlstr = CONCAT('create table cdrpbx10_',DATE_FORMAT(CURDATE(),'%Y%m'),' like cdrpbx10');PREPARE stmt1 FROM @sqlstr ;EXECUTE stmt1 ;SET @sqlstr = CONCAT('insert into cdrpbx10_',DATE_FORMAT(CURDAT