TABLE
CREATE TABLE
CREATE TABLE 用于在数据库创建新表,任何用户拥有所属模式的CREATE权限即可执行创建新表的操作。
当创建的表因包含外键(foreign key)或交错表(interleave)等需要关联其他表时,用户被关联表的REFERENCES权限即可。
当创建的表依赖其他序列(sequence)时,用户还需拥有所依赖序列的USAGE权限。
创建成功后,root用户拥有此表的全部权限:DROP,SELECT,INSERT,DELETE,UPDATE,REFERENCES权限。当创建用户不是root用户时,则除root角色外,该用户也同样拥有此表的全部权限。
语法格式
创建表的语法格式如下:
如果添加了IF NOT EXISTS,当要创建的表不存在时,创建表;如果已经存在,创建表不成功,但是不抛出错误。
如果不添加IF NOT EXISTS,当要创建的表不存在时,创建表;如果已经存在,创建表不成功,抛出错误:表已存在。
请注意,IF NOT EXISTS仅检查表名;它不检查现有表是否具有新表的相同列、索引、约束等。
- opt_temp
- column_def
- index_def
- family_def
- table_constraint
- opt_interleave
- opt_partition_by
- opt_locate_in
参数说明
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)来显示。
语法格式
显示所有表的语法格式如下:
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权限。
语法格式
有关修改表的语法格式如下:
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权限,即可执行删除目标表及所有相关依赖的操作。
语法格式
有关删除表语句的语法结构如下:
如果加上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 ) )