TABLE

CREATE TABLE

​ CREATE TABLE 用于在数据库创建新表,任何用户拥有所属模式的CREATE权限即可执行创建新表的操作。

​ 当创建的表因包含外键(foreign key)或交错表(interleave)等需要关联其他表时,用户被关联表的REFERENCES权限即可。

​ 当创建的表依赖其他序列(sequence)时,用户还需拥有所依赖序列的USAGE权限。

​ 创建成功后,root用户拥有此表的全部权限:DROP,SELECT,INSERT,DELETE,UPDATE,REFERENCES权限。当创建用户不是root用户时,则除root角色外,该用户也同样拥有此表的全部权限。

语法格式

创建表的语法格式如下:

TABLE - 图1

如果添加了IF NOT EXISTS,当要创建的表不存在时,创建表;如果已经存在,创建表不成功,但是不抛出错误。

如果不添加IF NOT EXISTS,当要创建的表不存在时,创建表;如果已经存在,创建表不成功,抛出错误:表已存在。

请注意,IF NOT EXISTS仅检查表名;它不检查现有表是否具有新表的相同列、索引、约束等。

  • opt_temp

TABLE - 图2

  • column_def

TABLE - 图3

  • index_def

TABLE - 图4

  • family_def

TABLE - 图5

  • table_constraint

TABLE - 图6

  • opt_interleave

TABLE - 图7

  • opt_partition_by

TABLE - 图8

  • opt_locate_in

TABLE - 图9

参数说明

  • table_name

    要创建的表的名称,在其数据库中必须是唯一的,并遵循identifier rules. 如果没有设置默认父数据库,则必须将名称格式设置为database.name。

  • opt_temp

    temp/temporary,该参数表明创建的表为临时表。临时表在其他session无法访问,且在查询/更新/删除等操作时优先级高于同名的普通表,在session关闭时删除。

  • column_def

    定义列的逗号分隔列表。 每列需要名称/标识符和数据类型; 列级约束或其他列限定(例如计算列)的指定是可选项。 列名在表中必须是唯一的,但可以与索引或约束具有相同的名称。

    在列级别定义的任何主键,唯一和检查约束将作为表创建的一部分移动到表级别。 使用SHOW CREATE TABLE语句在表级别查看它们。

  • index_def

    可选项,定义索引的逗号分隔列表。 对于每个索引,必须指定要索引的列; 可选择指定名称。 索引名称在表中必须是唯一的,并遵循标识符规则。 请参阅下面的创建具有辅助索引和倒排索引的表示例。

    CREATE INDEX语句可用于创建索引,与建表分开。

  • family_def

    可选项,定义列族的逗号分隔列表。 列族名称在表中必须是唯一的,但可以与列,约束或索引具有相同的名称。

    列族是一组列,它们作为单个键值对存储在基础键值存储中。 InCloud ZNBASE自动将列分组到列族中,以确保有效的存储和性能。 但是,有时你可能希望手动将列分配给族,更多详细信息,请参见列族文档。

  • table_constraint

    可选项,表级约束的逗号分隔列表。 约束名称在表中必须是唯一的,但可以与列,列族或索引具有相同的名称。

  • opt_interleave

    你可以通过交错表来优化查询性能,这会更改InCloud ZNBASE存储数据的方式。

  • opt_partition_by

    允许你在行级别定义表分区。 你可以按列LIST或按RANGE定义表分区。 有关更多信息,请参阅定义表分区文章。

  • opt_locate_in

    数据落盘位置。

示例

示例1:创建表(没有定义主键)

​ 在InCloud ZNBASE中,每个表都需要一个主键,如果未明确定义,则会自动添加INT类型的名为rowid的列作为主键并使用unique_rowid()函数确保新行始终默认为唯一的rowid值自动为主键创建索引。严格地说,主键的唯一索引并没有创建,它由数据存储层的key来区分,因此不需要额外的空间。 但是,在使用SHOW INDEX等命令时,它会显示为正常的唯一索引。

CREATE TABLE logon ( -> user_id INT, -> logon_date DATE -> );

CREATE TABLE

SHOW COLUMNS FROM logon;

column_name | data_type | is_nullable | column_default | generation_expression | indices | is_hidden

+——————-+—————-+——————-+————————+———————————-+—————-+—————-+

user_id | INT8 | true | NULL | | {} | false

logon_date | DATE | true | NULL | | {} | false

rowid | INT | false | unique_rowid() | | {primary} | true |

SHOW INDEX FROM logon;

table_name | index_name | non_unique | seq_in_index | column_name |direction | storing | implicit

+——————+——————+——————+———————+——————-+—————-+————-+—————+

logon | primary | false | 1 | rowid | ASC | false | false

示例2:创建表(定义主键)

在此示例中,我们创建一个包含三列的表,一列是主键,另一列是唯一约束,第三列没有约束。具有唯一约束的主键和列将自动创建索引。

CREATE TABLE t1 ( user_id INT PRIMARY KEY, user_email STRING UNIQUE, logoff_date DATE );

SHOW COLUMNS FROM t1;

column_name | data_type | is_nullable | column_default | generation_expression | indices | is_hidden

+——————-+—————-+——————-+————————+———————————-+——————————————-+—————-+

user_id | INT8 | false | NULL | | {primary,t1_user_email_key} | false

user_email | STRING | true | NULL | | {t1_user_email_key} | false

logoff_date | DATE | true | NULL | | {} | false |

SHOW INDEX FROM t1;

table_name | index_name | non_unique | seq_in_index | column_name |direction | storing | implicit

+——————+—————————-+——————+———————+——————-+—————-+————-+—————+

t1 | primary | false | 1 | user_id | ASC | false | false

t1 | t1_user_email_key | false | 1 | user_email | ASC | false | false

t1 | t1_user_email_key | false | 2 | user_id | ASC | false | true

示例3:创建具有二级索引和倒排索引的表

在此示例中,我们在表创建期间创建二级索引和反向索引,二级索引允许使用除主键以外的其他键有效访问数据,反向索引允许有效访问JSONB列中的无模式数据。

CREATE TABLE vehicles ( ID UUID NOT NULL, city STRING NOT NULL, TYPE STRING, owner_id UUID, creation_time TIMESTAMP, status STRING, current_location STRING, ext JSONB, CONSTRAINT “primary” PRIMARY KEY ( city ASC, ID ASC ), INDEX vehicles_auto_index_fk_city_ref_users ( city ASC, owner_id ASC ), INVERTED INDEX ix_vehicle_ext ( ext ), FAMILY “primary” ( ID, city, TYPE, owner_id, creation_time, status, current_location, ext ) );

SHOW INDEX FROM vehicles;

table_name | index_name | non_unique | seq_in_index | column_name | direction | storing | implicit

+——————+———————————————————-+——————+———————+——————-+—————-+————-+—————+

vehicles | primary | false | 1 | city | ASC | false | false

vehicles | primary | false | 2 | id | ASC | false | false

vehicles | vehicles_auto_index_fk_city_ref_users | true | 1 | city | ASC | false | false

vehicles | vehicles_auto_index_fk_city_ref_users | true | 2 | owner_id | ASC | false | false

vehicles | vehicles_auto_index_fk_city_ref_users | true | 3 | id | ASC | false | true

vehicles | ix_vehicle_ext | true | 1 | ext | ASC | false | false

vehicles | ix_vehicle_ext | true | 2 | city | ASC | false | true

vehicles | ix_vehicle_ext | true | 3 | id | ASC | false | true

示例4:使用自动生成的唯一行ID创建表

CREATE TABLE users ( ID UUID NOT NULL DEFAULT gen_random_uuid (), city STRING NOT NULL, NAME STRING NULL, address STRING NULL, credit_card STRING NULL, CONSTRAINT “primary” PRIMARY KEY ( city ASC, ID ASC ), FAMILY “primary” ( ID, city, NAME, address, credit_card ) );

INSERT INTO users (name, city) VALUES (‘Petee’, ‘new york’), (‘Eric’, ‘seattle’), (‘Dan’, ‘seattle’);

SELECT * FROM users;

id | city | name | address | credit_card

+———————————————————+—————+———-+————-+——————-+

62a7734e-3da3-4aea-ae0c-e18fe91f52b4 | new york | Petee | NULL | NULL

15c004c6-0b20-452d-8c9b-b3de5d6f531f | seattle | Eric | NULL | NULL

6d2d3c96-7a51-43d4-adc4-f3284f90f1c8 | seattle | Dan | NULL | NULL

或者,可以使用该函数的BYTES列uuid_v4()作为默认值:

CREATE TABLE users2 ( ID BYTES DEFAULT uuid_v4 (), city STRING NOT NULL, NAME STRING NULL, address STRING NULL, credit_card STRING NULL, CONSTRAINT “primary” PRIMARY KEY ( city ASC, ID ASC ), FAMILY “primary” ( ID, city, NAME, address, credit_card ) );

INSERT INTO users2 (name, city) VALUES (‘Anna’, ‘new york’), (‘Jonah’, ‘seattle’), (‘Terry’, ‘chicago’);

SELECT * FROM users2; id | city | name | address | credit_card

+———————————————————————————+—————+———-+————-+——————-+

\220s\330\333\301|@a\260=H\037u1\261\333 | chicago | Terry | NULL | NULL \001Z\177(\211\012B\347\211\023\031\271w\336\017\276 | new york | Anna | NULL | NULL \347\203\2256\252LK5\266\017\357\244\033zu\235 | seattle | Jonah | NULL | NULL

​ 无论哪种情况,生成的ID都是128位,足够大,几乎没有机会生成非唯一值。此外,一旦表超出单个键值范围(默认情况下超过64MB),新的ID将散布在表的所有范围内,因此可能散布在不同的节点上,这意味着多个节点将分担负载,这种方法的缺点是创建一个主键,该主键在直接查询中可能没有用,这可能需要与另一个表或辅助索引联接。

​ 如果它是重要的,要被存储在相同的键值范围生成的ID,就可以使用一个整数类型与unique_rowid()功能作为缺省值,明确地或经由SERIAL伪类型:

CREATE TABLE users3 ( ID INT DEFAULT unique_rowid (), city STRING NOT NULL, NAME STRING NULL, address STRING NULL, credit_card STRING NULL, CONSTRAINT “primary” PRIMARY KEY ( city ASC, ID ASC ), FAMILY “primary” ( ID, city, NAME, address, credit_card ) );

INSERT INTO users3 (name, city) VALUES (‘Blake’, ‘chicago’), (‘Hannah’, ‘seattle’), (‘Bobby’, ‘seattle’);

SELECT * FROM users3; id | city | name | address | credit_card

+——————————+————-+————+————-+——————-+

504599519784468481 | chicago | Blake | NULL | NULL

504599519784566785 | seattle | Hannah | NULL | NULL

504599519784599553 | seattle | Bobby | NULL | NULL

​ 插入或向上插入后,该unique_rowid()函数根据时间戳和执行插入的节点的ID生成默认值。这样的时间顺序值可能是全局唯一的,除非每个节点每秒生成大量ID(100,000+)。同样,可能存在差距,不能完全保证顺序。

示例5:创建具有外键约束的表

外键约束确保一列只使用它引用的列中已经存在的值,这些值必须来自另一个表。此约束强制两个表之间的引用完整性。

有许多规则可以控制外键,但是两个最重要的规则是:

  • 外键列必须被索引使用创建表时INDEX,PRIMARY KEY或UNIQUE。

  • 引用的列必须仅包含唯一值。这意味着该REFERENCES子句必须使用与主键或唯一约束完全相同的列。

可以包括外键操作,以指定在更新或删除由外键约束引用的列时发生的情况。默认操作是ON UPDATE NO ACTION和ON DELETE NO ACTION。

在此示例中,我们使用ON DELETE CASCADE(即,当外键约束引用的行被删除时,所有相关行也将被删除)。

CREATE TABLE users ( ID UUID PRIMARY KEY DEFAULT gen_random_uuid (), city STRING, NAME STRING, address STRING, credit_card STRING, dl STRING UNIQUE CHECK ( LENGTH ( dl ) < 8 ) );

CREATE TABLE vehicles ( ID UUID NOT NULL DEFAULT gen_random_uuid (), city STRING NOT NULL, TYPE STRING, owner_id UUID REFERENCES users ( ID ) ON DELETE CASCADE, creation_time TIMESTAMP, status STRING, current_location STRING, ext JSONB, CONSTRAINT “primary” PRIMARY KEY ( city ASC, ID ASC ), INDEX vehicles_auto_index_fk_city_ref_users ( city ASC, owner_id ASC ), INVERTED INDEX ix_vehicle_ext ( ext ), FAMILY “primary” ( ID, city, TYPE, owner_id, creation_time, status, current_location, ext ) );

SHOW CREATE TABLE vehicles;

table_name | create_statement +——————+———————————————————————————————————————————————————+

vehicles | CREATE TABLE vehicles ( | id UUID NOT NULL DEFAULT gen_random_uuid(), | city STRING NOT NULL, | type STRING NULL, | owner_id UUID NULL, | creation_time TIMESTAMP NULL, | status STRING NULL, | current_location STRING NULL, | ext JSONB NULL, | CONSTRAINT “primary” PRIMARY KEY (city ASC, id ASC), | INDEX vehicles_auto_index_fk_city_ref_users (city ASC, owner_id ASC), | INVERTED INDEX ix_vehicle_ext (ext), | CONSTRAINT fk_owner_id_ref_users FOREIGN KEY (owner_id) REFERENCES users (id) ON DELETE CASCADE, | INDEX vehicles_auto_index_fk_owner_id_ref_users (owner_id ASC), | FAMILY “primary” (id, city, type, owner_id, creation_time, status, current_location, ext) | )

INSERT INTO users (name, dl) VALUES (‘Annika’, ‘ABC-123’);

SELECT * FROM users;

id | city | name | address | credit_card | dl

+———————————————————+———+————+————-+——————-+————-+

5fe4e92f-0fb8-4bcd-956e-4ffbe43f8ccc | NULL | Annika | NULL | NULL | ABC-123

INSERT INTO vehicles (city, owner_id) VALUES (‘seattle’, ‘5fe4e92f-0fb8-4bcd-956e-4ffbe43f8ccc’);

SELECT * FROM vehicles; id | city | type | owner_id | creation_time | status | current_location | ext

+———————————————————+————-+———+———————————————————+———————-+————+—————————+———+

e086adf0-3416-4557-b537-3f6d1a9aa4ee | seattle | NULL | 5fe4e92f-0fb8-4bcd-956e-4ffbe43f8ccc | NULL | NULL | NULL | NULL

DELETE FROM users WHERE id = ‘5fe4e92f-0fb8-4bcd-956e-4ffbe43f8ccc’;

SELECT * FROM vehicles;

id | city | type | owner_id | creation_time | status | current_location | ext

+——+———+———+—————+———————-+————+—————————+——-+

(0 rows) |

示例6:创建一个具有CHECK约束的表

在此示例中,我们创建users表,但是具有一些列约束。一列是主键,另一列被赋予唯一约束和检查约束,该约束限制了字符串的长度。自动索引主键列和具有唯一约束的列。

CREATE TABLE users (

ID UUID PRIMARY KEY, city STRING, NAME STRING, address STRING, credit_card STRING, dl STRING UNIQUE CHECK ( LENGTH ( dl )< 8 ) ); SHOW COLUMNS FROM users;

column_name | data_type | is_nullable | column_default | generation_expression | indices | is_hidden

+——————-+—————-+——————-+————————+———————————-+————————————+—————-+

id | UUID | false | NULL | | {primary,users_dl_key} | false

city | STRING | true | NULL | | {} | false

name | STRING | true | NULL | | {} | false

address | STRING | true | NULL | | {} | false

credit_card | STRING | true | NULL | | {} | false

dl | STRING | true | NULL | | {users_dl_key} | false

SHOW INDEX FROM users;

table_name | index_name | non_unique | seq_in_index | column_name | direction | storing | implicit

+——————+———————+——————+———————+——————-+—————-+————-+—————+

users | primary | false | 1 |

id | ASC | false | false users | users_dl_key | false | 1 |

dl | ASC | false | false users | users_dl_key | false | 2 |

id | ASC | false | true

示例7:创建一个KV存储镜像的表

​ InCloud ZNBASE是基于事务性和高度一致的键值存储构建的分布式SQL数据库。尽管无法直接访问键值存储,但是可以使用两列的“简单”表(其中一组作为主键)来镜像直接访问:

CREATE TABLE kv (k INT PRIMARY KEY, v BYTES);

​ 当这样一个“简单”的表没有索引或外键,INSERT/ UPSERT/ UPDATE/DELETE语句转换为用最小的开销(个位数的百分比速度变慢)键值操作。例如,以下UPSERT在表中添加或替换行的操作将转换为单个键值Put操作:

UPSERT INTO kv VALUES (1, b’hello’);

这种SQL表方法还为用户提供了一种定义明确的查询语言,一种已知的事务模型,并在需要时可以灵活地向表中添加更多列。

示例8:从SELECT语句创建一个表可以使用该CREATE TABLE AS语句根据语句结果创建新表SELECT。例如,假设在users表中有许多行用户数据,并且想从位于纽约的用户子集创建一个新表。

SELECT * FROM users WHERE city = ‘new york’;

id | city | name | address | credit_card

+———————————————————+—————+—————————+——————————————-+——————-+

00000000-0000-4000-8000-000000000000 | new york | Robert Murphy | 99176 Anderson Mills |

8885705228 051eb851-eb85-4ec0-8000-000000000001 | new york | James Hamilton | 73488 Sydney Ports Suite 57 | 8340905892 0a3d70a3-d70a-4d80-8000-000000000002 | new york | Judy White | 18580 Rosario Ville Apt. 61 |

2597958636 0f5c28f5-c28f-4c00-8000-000000000003 | new york | Devin Jordan | 81127 Angela Ferry Apt. 8 |

5614075234 147ae147-ae14-4b00-8000-000000000004 | new york | Catherine Nelson | 1149 Lee Alley |

CREATE TABLE users_ny AS SELECT * FROM users WHERE city = ‘new york’;

SELECT * FROM users_ny; id | city | name | address | credit_card

+———————————————————+—————+—————————+——————————————-+——————-+

00000000-0000-4000-8000-000000000000 | new york | Robert Murphy | 99176 Anderson Mills |

8885705228 051eb851-eb85-4ec0-8000-000000000001 | new york | James Hamilton | 73488 Sydney Ports Suite 57 | 8340905892 0a3d70a3-d70a-4d80-8000-000000000002 | new york | Judy White | 18580 Rosario Ville Apt. 61 |

2597958636 0f5c28f5-c28f-4c00-8000-000000000003 | new york | Devin Jordan | 81127 Angela Ferry Apt. 8 |

5614075234 147ae147-ae14-4b00-8000-000000000004 | new york | Catherine Nelson | 1149 Lee Alley | 0792553487

示例9:使用计算列创建表 在此示例中,让我们创建一个带有计算列的简单表:

CREATE TABLE users ( ID UUID PRIMARY KEY DEFAULT gen_random_uuid (), city STRING, first_name STRING, last_name STRING, full_name STRING AS ( CONCAT ( first_name, ‘ ‘, last_name )) STORED, address STRING, credit_card STRING, dl STRING UNIQUE CHECK ( LENGTH ( dl ) < 8 ) ); |

然后,插入几行数据:

INSERT INTO users ( first_name, last_name ) VALUES ( ‘Lola’, ‘McDog’ ), ( ‘Carl’, ‘Kimball’ ), ( ‘Ernie’, ‘Narayan’ );

SELECT * FROM users; id | city | first_name | last_name | full_name | address | credit_card | dl

+———————————————————+———+——————+—————-+———————-+————-+——————-+———+

0023b976-4402-4211-950c-b14d60c3bb1d | NULL | Lola | McDog | Lola McDog | NULL | NULL | NULL

23d4474e-1535-4799-a21a-d3a5fe989e46 | NULL | Ernie | Narayan | Ernie Narayan | NULL | NULL | NULL

a08506b7-6679-4494-8f03-b223c4ad87ba | NULL | Carl | Kimball | Carl Kimball | NULL | NULL | NULL |

该full_name列是根据first_name和来计算的,last_name无需定义视图。

示例10:创建带有分区的表,通过列表创建具有分区的表。在此示例中,我们创建一个表并按LIST定义分区。

CREATE TABLE rides ( ID UUID NOT NULL, city STRING NOT NULL, vehicle_city STRING, rider_id UUID, vehicle_id UUID, start_address STRING, end_address STRING, start_time TIMESTAMP, end_time TIMESTAMP, revenue DECIMAL ( 10, 2 ), CONSTRAINT “primary” PRIMARY KEY ( city ASC, ID ASC ), INDEX rides_auto_index_fk_city_ref_users ( city ASC, rider_id ASC ), INDEX rides_auto_index_fk_vehicle_city_ref_vehicles ( vehicle_city ASC, vehicle_id ASC ), FAMILY “primary” ( ID, city, vehicle_city, rider_id, vehicle_id, start_address, end_address, start_time, end_time, revenue ), CONSTRAINT check_vehicle_city_city CHECK ( vehicle_city = city )) PARTITION BY LIST ( city ) ( PARTITION new_york VALUES IN ( ‘new york’ ), PARTITION chicago VALUES IN ( ‘chicago’ ), PARTITION seattle VALUES IN ( ‘seattle’ )); |

创建一个按分区划分表。在此示例中,我们创建一个表并按range定义分区。

CREATE TABLE rides ( ID UUID NOT NULL, city STRING NOT NULL, vehicle_city STRING, rider_id UUID, vehicle_id UUID, start_address STRING, end_address STRING, start_time TIMESTAMP, end_time TIMESTAMP, ride_length INTERVAL AS ( start_time - end_time ) STORED, revenue DECIMAL ( 10, 2 ), CONSTRAINT “primary” PRIMARY KEY ( ride_length ASC, city ASC, ID ASC ), INDEX rides_auto_index_fk_city_ref_users ( city ASC, rider_id ASC ), INDEX rides_auto_index_fk_vehicle_city_ref_vehicles ( vehicle_city ASC, vehicle_id ASC ), FAMILY “primary” ( ID, city, vehicle_city, rider_id, vehicle_id, start_address, end_address, start_time, end_time, revenue ), CONSTRAINT check_vehicle_city_city CHECK ( vehicle_city = city )) PARTITION BY RANGE ( ride_length ) ( PARTITION short_rides VALUES FROM ( ‘0 seconds’ ) TO ( ‘30 minutes’ ), PARTITION long_rides VALUES

FROM ( ‘30 minutes’ ) TO ( MAXVALUE ));

示例11:显示表的定义

要显示表的定义,请使用以下SHOW CREATE语句。create_statement响应中列的内容是一个带有嵌入式换行符的字符串,当回显时,该换行符将生成格式化的输出。

| > SHOW CREATE rides; table_name | create_statement

+——————+———————————————————————————————————————————————————————————————————————+ rides | CREATE TABLE rides ( | id UUID NOT NULL, | city STRING NOT NULL, | vehicle_city STRING NULL, | rider_id UUID NULL, | vehicle_id UUID NULL, | start_address STRING NULL, | end_address STRING NULL, | start_time TIMESTAMP NULL, | end_time TIMESTAMP NULL, | ride_length INTERVAL NOT NULL AS (start_time - end_time) STORED, | revenue DECIMAL(10,2) NULL, | CONSTRAINT “primary” PRIMARY KEY (ride_length ASC, city ASC, id ASC), | INDEX rides_auto_index_fk_city_ref_users (city ASC, rider_id ASC), | INDEX rides_auto_index_fk_vehicle_city_ref_vehicles (vehicle_city ASC, vehicle_id ASC), | FAMILY “primary” (id, city, vehicle_city, rider_id, vehicle_id, start_address, end_address, start_time, end_time, revenue, ride_length), | CONSTRAINT check_vehicle_city_city CHECK (vehicle_city = city) ENABLE | ) PARTITION BY RANGE (ride_length) ( | PARTITION short_rides VALUES FROM (‘00:00:00’) TO (‘00:30:00’), | PARTITION long_rides VALUES FROM (‘00:30:00’) TO (MAXVALUE) | ) (1 row) |

SHOW TABLES

​ SHOW TABLES可显示目标数据库的目标模式下的表或视图(如未指定数据库则默认为当前数据库,如未指定模式则默认为目标数据库search_path中首个存在的模式)。用户拥有该模式下的表的任意权限,即可显示。

当一个表或者视图正在被dropped,SHOW TABLES会对它添加前缀(dropped)来显示。

语法格式

显示所有表的语法格式如下:

TABLE - 图10

FROM用来指定查询表的范围,SHOW TABLES将首先尝试查找具有指定名称的SCHEMA。如果失败,它将尝试查找具有该名称的数据库,并列出其public SCHEMA的表。有关更多详细信息,请参见名称解析。

参数说明

  • name

其中‘.’前面的name为其要显示表的数据库名称,‘.’后面的name为其要显示表的模式(SCHEMA)的名称。当两个name被省略时,则在当前数据库的当前模式(SCHEMA)中查找显示。

  • with_comment

WITH COMMENT 加上该关键字用于查看表上注释。

示例

示例1:显示当前数据库中的表

SHOW TABLES使用默认的当前模式 public集search_path:

SHOW TABLES;

table_name

+——————+

kv rides t1 users |

示例2:显示不同模式下的表

可以在当前模式(SCHEMA)以外的其他模式(SCHEMA)中显示表。还可以按表显示模式(SCHEMA):

SHOW TABLES FROM db4.information_schema;

SHOW TABLES FROM information_schema;

因为db4是当前数据库,所以这些语句返回相同的输出:

table_name

+—————————————————-+

administrable_role_authorizations

applicable_roles column_privileges columns

constraint_column_usage

enabled_roles key_column_usage

parameters

referential_constraints

role_table_grants routines

schema_privileges

schemata

sequences

statistics

table_constraints

table_privileges

tables

user_privileges

views

示例3:显示不同数据库下的表

还可以显示来自其他数据库的表。

SHOW TABLES FROM system.public;

SHOW TABLES FROM system;

因为public是当前模式,所以这些语句返回相同的输出:

table_name

+—————————+

authentication

comments

descriptor

eventlog

jobs

lease

location

locations

namespace

rangelog

role_members

settings

snapshots

table_statistics

ui

users

web_sessions

zones

示例4:显示带有注释的用户定义表

可以用来COMMENT ON在表格上添加注释。

COMMENT ON TABLE users IS ‘This table contains information about users.’; |

要查看表的注释:

SHOW TABLES FROM db4 WITH COMMENT;

table_name | comment

+——————————————+———————————————————————+

users | This table contains information about users.

vehicles

rides

vehicle_location_histories

promo_codes

user_promo_codes | (6 rows) |

示例5:显示带有注释的虚拟表

要查看带有注释和文档链接的虚拟表,请使用SHOW TABLES FROM <virtual schema> WITH COMMENT:

SHOW TABLES FROM information_schema WITH COMMENT;

table_name | comment

+—————————————————-+——————————————————————————————————————————————————————————————————+ administrable_role_authorizations | roles for which the current user has admin option

applicable_roles | roles available to the current user

check_constraints | check constraints

column_privileges | column privilege grants (incomplete)

ALTER TABLE

​ ALTER TABLE 语句用于在已有的表中添加、修改或删除列。同时,可以对表上的约束,索引以及分区信息进行修改。

​ 表的重命名支持跨数据库迁移操作,即重命名后的表可迁移到新的数据库和新的模式中。当目标表不存在VIEW依赖时,任何用户拥有表重命名后所属模式的CREATE权限、重名前原表的DROP权限时,即可执行重命名目标表的操作。当目标表依赖于其他序列时,还需要所依赖序列的USAGE权限。修改成功后,该用户拥有重命名表的全部权限:DROP,SELECT,INSERT,DELETE,UPDATE,REFERENCES权限,且其他用户保留对该表的原有权限。当存在VIEW依赖时,则不允许重命名操作。

​ 任何用户拥有目标表的REFERENCES权限即可执行变更此表属性的操作:对表格属性的增加,删除,修改。当用户变更目标表的外键(foreign key)或交错表(interleave)时,还需要被关联表的REFERENCES权限。

语法格式

有关修改表的语法格式如下:

TABLE - 图11

RENAME

  • RENAME COLUMN

更改列的名称。前一个column_name为旧名称后面一个为新名称

  • RENAME CONSTRAINT

更改约束列。详细信息见CONSTRAINT

ADD

  • ADD COLUMN

添加新列到表。如果加上IF NOT EXISTS,如果该列不存在,则创建列成功;如果该列存在,则创建失败,但是不抛出错误。如果不加上IF NOT EXISTS,如果该列不存在,则创建列成功;如果该列存在,则创建失败,抛出错误:该列已存在。

  • ADD CONSTRAINT

向列增加新的约束。详细信息见CONSTRAINT部分。

  • ALTER

更改或删除列的DEFAULT约束或NOT NULL约束。详情请见COLUMN部分。

DROP

  • DROP COLUMN

从表中删除列。详情请见COLUMN部分。

  • DROP CONSTRAINT

从列中删除约束。详情请见CONSTRAINT部分。

  • VALIDATE CONSTRAINT

检查列中的值是否与列上的约束匹配。

  • ENABLE OR DISABLE CONSTRAINT

更改CHECK约束的生效状态。

  • EXPERIMENTAL_AUDIT

启用每个表审核日志。

  • PARTITION BY

对表进行分区,重新分区或取消分区。详情请见PARTITION BY&LOCATE

参数说明

  • table_name

表名

  • column_name

表中的列名,当一个语法分支中只出现一次column_name时,指的是将要做修改的列名。当一个语法分支中出现两次column_name时,前者代表修改之前的列名,后者指的是修改之后的列名。

  • typename

列的数据类型(如int等)

  • col_qual_list

列定义的可选列表,其中可能包括列级约束,排序规则或列族分配。如果未指定列族,则该列将被添加到第一个列族。有关如何分配列族的更多信息,请参见列族。

注意,不可能添加带有外键约束的列。解决方法是,可以添加没有约束的列,然后使用CREATE INDEX对该列建立索引,然后使用ADD CONSTRAINT将外键约束添加到该列。

  • a_expr

要使用的新默认值。

  • collation_name

排序规则名称。

  • audit_mode

  • partition_by

分区关键字PARTITION BY。详细信息见PARTITION BY&LOCATE。

  • opt_locate_in

数据落盘位置选择,LOCATE IN后面加数据落盘地点。详情请见PARTITION BY&LOCATE。

示例

示例1:修改表名

SHOW TABLES;

table_name

+——————+

kv

rides

t1

users

ALTER TABLE users RENAME TO re_users;

SHOW TABLES;

table_name

+——————+

kv

re_users

rides

t1

示例2:设置约束(CHECK)的可用状态

CREATE TABLE newtable_1 ( ID INT8 NOT NULL, CONSTRAINT newtable_1_pk PRIMARY KEY ( ID ASC ), FAMILY “primary” ( ID ), CONSTRAINT newtable_1_check CHECK ( ID > 5 ) ENABLE );

ALTER TABLE public.newtable_1 DISABLE CONSTRAINT newtable_1_check;

SHOW CREATE TABLE newtable_1;

CREATE TABLE newtable_1 ( ID INT8 NOT NULL, CONSTRAINT newtable_1_pk PRIMARY KEY ( ID ASC ), FAMILY “primary” ( ID ), CONSTRAINT newtable_1_check CHECK ( ID > 5 ) DISABLE )|

DROP TABLE

​ DROP TABLE 语句用于从数据库中删除表及其所有索引。

​ 任何用户拥有无依赖关系的目标表的DROP权限,即可执行删除目标表的操作。删除成功后,所有用户针对目标表的所有权限均被删除。

​ 当目标表存在依赖关系时,需使用CASCADE关键字删除。当目标表存在被其他表关联的外键约束和交错表关联时,需拥用关联表的REFERENCES权限方可删除关联关系,否则删除目标表操作失败。若目标表存在VIEW等依赖关系,用户拥有目标表的DROP权限和所有依赖此表的VIEW的DROP权限,即可执行删除目标表及所有相关依赖的操作。

语法格式

有关删除表语句的语法结构如下:

TABLE - 图12

如果加上IF EXISTS删除表(如果存在);如果不存在,则不返回错误。如果不加上IF EXISTS 删除表(如果存在);如果不存在,则返回错误:该表不存在。

CASCADE删除所有依赖于表的对象(例如constraints和views)。CASCADE不会列出删除的对象,因此应谨慎使用。

RESTRICT(默认值)如果有一些对象(例如constraints和views)依赖该表,则不会删除该表。

参数说明

  • table_name

要删除的表名。

示例

示例1:删除表(无依赖性)

SHOW TABLES;

table_name

+——————+

kv

re_users

rides

t1

DROP TABLE t1;

SHOW TABLES;

table_name

+——————+

kv

re_users

rides

示例2:使用CASCADE删除表和相关对象,在此示例中,来自其他表的外键引用了要删除的表。因此,只能使用删除表,同时删除依赖的外键约束CASCADE。

SHOW TABLES;

table_name

+——————————————+

rides

user_promo_codes

users

vehicle_location_histories

vehicles

DROP TABLE users;

pq: “users” is referenced by foreign key from table “vehicles”

要查看如何users从中引用vehicles,可以使用SHOW CREATE语句。SHOW CREATE显示如何创建表中的列,包括数据类型,默认值,索引和约束。

SHOW CREATE TABLE vehicles;

table_name | create_statement

+——————+———————————————————————————————————————————————-+

vehicles | CREATE TABLE vehicles ( ID UUID NOT NULL, city VARCHAR NOT NULL, TYPE VARCHAR NULL, owner_id UUID NULL, creation_time TIMESTAMP NULL, status VARCHAR NULL, current_location VARCHAR NULL, ext JSONB NULL, CONSTRAINT “primary” PRIMARY KEY ( city ASC, ID ASC ), CONSTRAINT fk_city_ref_users FOREIGN KEY ( city, owner_id ) REFERENCES users ( city, ID ), INDEX vehicles_auto_index_fk_city_ref_users ( city ASC, owner_id ASC ), FAMILY “primary” ( ID, city, TYPE, owner_id, creation_time, status, current_location, ext ))

DROP TABLE users CASCADE;

SHOW TABLES; table_name

+——————————————+

rides

user_promo_codes

vehicle_location_histories

vehicles

使用一条SHOW CREATE TABLE语句来验证外键约束已从vehicles中删除。

SHOW CREATE TABLE vehicles;

table_name | create_statement

+——————+———————————————————————————————————————————————-+

vehicles | CREATE TABLE vehicles ( ID UUID NOT NULL, city STRING NOT NULL, TYPE STRING NULL, owner_id UUID NULL, creation_time TIMESTAMP NULL, status STRING NULL, current_location STRING NULL, ext JSONB NULL, CONSTRAINT “primary” PRIMARY KEY ( city ASC, ID ASC ), INDEX vehicles_auto_index_fk_city_ref_users ( city ASC, owner_id ASC ), FAMILY “primary” ( ID, city, TYPE, owner_id, creation_time, status, current_location, ext ) )