@@ -11,19 +11,19 @@ import EEFeature from '@site/src/components/EEFeature';
1111
1212<EEFeature featureName =' COMPUTED COLUMN ' />
1313
14- 创建表是许多数据库中最复杂的操作之一 ,因为您可能需要:
14+ 对于许多数据库来说,创建表是最复杂的操作之一 ,因为您可能需要:
1515
1616* 手动指定引擎
1717* 手动指定索引
1818* 甚至指定数据分区或数据分片
1919
2020Databend旨在通过设计变得易于使用,并且在创建表时不需要任何这些操作。此外,CREATE TABLE语句提供了这些选项,使您在各种场景下创建表变得更加容易:
2121
22- - [ CREATE TABLE] ( #create-table ) : 从头开始创建一个表 。
22+ - [ CREATE TABLE] ( #create-table ) : 从头开始创建表 。
2323- [ CREATE TABLE ... LIKE] ( #create-table--like ) : 创建一个与现有表具有相同列定义的表。
2424- [ CREATE TABLE ... AS] ( #create-table--as ) : 创建一个表并使用SELECT查询的结果插入数据。
25- - [ CREATE TRANSIENT TABLE] ( #create-transient-table ) : 创建一个不存储历史数据以进行时间回溯的表 。
26- - [ CREATE TABLE ... EXTERNAL_LOCATION] ( #create-table--external-location ) : 创建一个表并指定一个S3桶用于数据存储 ,而不是FUSE引擎。
25+ - [ CREATE TRANSIENT TABLE] ( #create-transient-table ) : 创建一个不存储其历史数据以进行时间回溯的表 。
26+ - [ CREATE TABLE ... EXTERNAL_LOCATION] ( #create-table--external_location ) : 创建一个表并指定一个S3桶作为数据存储 ,而不是FUSE引擎。
2727
2828## CREATE TABLE
2929
@@ -41,15 +41,15 @@ CREATE [ OR REPLACE ] [ TRANSIENT ] TABLE [ IF NOT EXISTS ] [ <database_name>. ]
4141::: note
4242- 有关Databend中可用的数据类型,请参阅[ 数据类型] ( ../../../00-sql-reference/10-data-types/index.md ) 。
4343
44- - Databend建议在命名列时尽量避免使用特殊字符。然而,在某些情况下,如果需要使用特殊字符 ,别名应使用反引号括起来,例如:CREATE TABLE price(\` $CA\` int);
44+ - Databend建议在命名列时尽量避免使用特殊字符。然而,在某些情况下,如果特殊字符是必要的 ,别名应使用反引号括起来,例如:CREATE TABLE price(\` $CA\` int);
4545
4646- Databend会自动将列名转换为小写。例如,如果您将列命名为* Total* ,它将在结果中显示为* total* 。
4747:::
4848
4949
5050## CREATE TABLE ... LIKE
5151
52- 创建一个与现有表具有相同列定义的表。现有表的列名、数据类型及其非空约束将被复制到新表中 。
52+ 创建一个与现有表具有相同列定义的表。现有表的列名、数据类型及其非NULL约束将被复制到新表中 。
5353
5454语法:
5555``` sql
@@ -60,7 +60,7 @@ LIKE [db.]origin_table_name
6060此命令不包括原始表中的任何数据或属性(如` CLUSTER BY ` 、` TRANSIENT ` 和` COMPRESSION ` ),而是使用默认的系统设置创建一个新表。
6161
6262:::note 解决方法
63- - 在使用此命令创建新表时 ,可以显式指定` TRANSIENT ` 和` COMPRESSION ` 。例如,
63+ - 当您使用此命令创建新表时 ,可以显式指定` TRANSIENT ` 和` COMPRESSION ` 。例如,
6464
6565``` sql
6666create transient table t_new like t_old;
@@ -82,7 +82,7 @@ AS SELECT query
8282此命令不包括原始表中的任何属性(如CLUSTER BY、TRANSIENT和COMPRESSION),而是使用默认的系统设置创建一个新表。
8383
8484:::note 解决方法
85- - 在使用此命令创建新表时 ,可以显式指定` TRANSIENT ` 和` COMPRESSION ` 。例如,
85+ - 当您使用此命令创建新表时 ,可以显式指定` TRANSIENT ` 和` COMPRESSION ` 。例如,
8686
8787``` sql
8888create transient table t_new as select * from t_old;
@@ -97,7 +97,7 @@ create table t_new compression='lz4' as select * from t_old;
9797
9898瞬态表用于保存不需要数据保护或恢复机制的临时数据。Databend不为瞬态表保留历史数据,因此您将无法使用时间回溯功能查询瞬态表的先前版本,例如,SELECT语句中的[ AT] ( ./../../20-query-syntax/03-query-at.md ) 子句对瞬态表不起作用。请注意,您仍然可以[ 删除] ( ./20-ddl-drop-table.md ) 和[ 恢复] ( ./21-ddl-undrop-table.md ) 瞬态表。
9999
100- 瞬态表有助于节省存储成本 ,因为与非瞬态表相比,它们不需要额外的空间来存储历史数据。有关详细解释,请参阅[ 示例] ( #create-transient-table-1 ) 。
100+ 瞬态表有助于节省存储费用 ,因为与非瞬态表相比,它们不需要额外的空间来存储历史数据。有关详细解释,请参阅[ 示例] ( #create-transient-table-1 ) 。
101101
102102::: caution
103103对瞬态表的并发修改(包括写操作)可能会导致数据损坏,使数据不可读。此缺陷正在解决中。在修复之前,请避免对瞬态表进行并发修改。
@@ -121,7 +121,7 @@ CREATE TRANSIENT TABLE ...
121121``` sql
122122DEFAULT < expr>
123123```
124- 指定在通过 ` INSERT ` 或` CREATE TABLE AS SELECT ` 语句未指定值时插入到列中的默认值 。
124+ 如果通过 ` INSERT ` 或` CREATE TABLE AS SELECT ` 语句未指定值,则指定插入到列中的默认值 。
125125
126126例如:
127127
@@ -206,11 +206,171 @@ CREATE TABLE IF NOT EXISTS employees (
206206:::tip 存储还是虚拟?
207207在选择存储计算列和虚拟计算列时,请考虑以下因素:
208208
209- - 存储空间:存储计算列占用表中的额外存储空间,因为它们的计算值是物理存储的 。如果您有有限的存储空间或希望最小化存储使用,虚拟计算列可能是一个更好的选择。
209+ - 存储空间:存储计算列占用表中的额外存储空间,因为其计算值是物理存储的 。如果您有有限的存储空间或希望最小化存储使用,虚拟计算列可能是一个更好的选择。
210210
211211- 实时更新:存储计算列在依赖列更新时立即更新其计算值。这确保了在查询时始终拥有最新的计算值。虚拟计算列则在查询时动态计算其值,这可能会稍微增加处理时间。
212212
213- - 数据完整性和一致性:存储计算列在写操作时立即维护数据一致性,因为它们的计算值在写操作时更新。虚拟计算列则在查询时动态计算其值,这意味着在写操作和后续查询之间可能存在短暂的
213+ - 数据完整性和一致性:存储计算列在写操作时立即维护数据一致性,因为其计算值在写操作时更新。虚拟计算列则在查询时动态计算其值,这意味着在写操作和后续查询之间可能存在短暂的暂时不一致。
214+ :::
215+
216+ ## MySQL兼容性
217+
218+ Databend的语法与MySQL的主要区别在于数据类型和一些特定的索引提示。
219+
220+ ## 示例
221+
222+ ### 创建表
223+
224+ 创建一个表并为列指定默认值(在本例中,` genre ` 列的默认值为'General'):
225+
226+ ``` sql
227+ CREATE TABLE books (
228+ id BIGINT UNSIGNED,
229+ title VARCHAR ,
230+ genre VARCHAR DEFAULT ' General'
231+ );
232+ ```
233+
234+ 描述表以确认结构和` genre ` 列的默认值:
235+
236+ ``` sql
237+ DESC books;
238+ + -- -----+-----------------+------+---------+-------+
239+ | Field | Type | Null | Default | Extra |
240+ + -- -----+-----------------+------+---------+-------+
241+ | id | BIGINT UNSIGNED | YES | 0 | |
242+ | title | VARCHAR | YES | " " | |
243+ | genre | VARCHAR | YES | ' General' | |
244+ + -- -----+-----------------+------+---------+-------+
245+ ```
246+
247+ 插入一行而不指定` genre ` :
248+
249+ ``` sql
250+ INSERT INTO books(id, title) VALUES (1 , ' Invisible Stars' );
251+ ```
252+
253+ 查询表并注意到` genre ` 列已设置为默认值'General':
254+
255+ ``` sql
256+ SELECT * FROM books;
257+ + -- --+----------------+---------+
258+ | id | title | genre |
259+ + -- --+----------------+---------+
260+ | 1 | Invisible Stars| General |
261+ + -- --+----------------+---------+
262+ ```
263+
264+ ### 创建表 ... Like
265+
266+ 创建一个新表(` books_copy ` ),其结构与现有表(` books ` )相同:
267+
268+ ``` sql
269+ CREATE TABLE books_copy LIKE books;
270+ ```
271+
272+ 检查新表的结构:
273+
274+ ``` sql
275+ DESC books_copy;
276+ + -- -----+-----------------+------+---------+-------+
277+ | Field | Type | Null | Default | Extra |
278+ + -- -----+-----------------+------+---------+-------+
279+ | id | BIGINT UNSIGNED | YES | 0 | |
280+ | title | VARCHAR | YES | " " | |
281+ | genre | VARCHAR | YES | ' General' | |
282+ + -- -----+-----------------+------+---------+-------+
283+ ```
284+
285+ 向新表插入一行并注意到` genre ` 列的默认值已被复制:
286+
287+ ``` sql
288+ INSERT INTO books_copy(id, title) VALUES (1 , ' Invisible Stars' );
289+
290+ SELECT * FROM books_copy;
291+ + -- --+----------------+---------+
292+ | id | title | genre |
293+ + -- --+----------------+---------+
294+ | 1 | Invisible Stars| General |
295+ + -- --+----------------+---------+
296+ ```
297+
298+ ### 创建表 ... As
299+
300+ 创建一个新表(` books_backup ` ),其中包含现有表(` books ` )的数据:
301+
302+ ``` sql
303+ CREATE TABLE books_backup AS SELECT * FROM books;
304+ ```
305+
306+ 描述新表并注意到` genre ` 列的默认值未被复制:
307+
308+ ``` sql
309+ DESC books_backup;
310+ + -- -----+-----------------+------+---------+-------+
311+ | Field | Type | Null | Default | Extra |
312+ + -- -----+-----------------+------+---------+-------+
313+ | id | BIGINT UNSIGNED | NO | 0 | |
314+ | title | VARCHAR | NO | " " | |
315+ | genre | VARCHAR | NO | NULL | |
316+ + -- -----+-----------------+------+---------+-------+
317+ ```
318+
319+ 查询新表并注意到原始表的数据已被复制:
320+
321+ ``` sql
322+ SELECT * FROM books_backup;
323+ + -- --+----------------+---------+
324+ | id | title | genre |
325+ + -- --+----------------+---------+
326+ | 1 | Invisible Stars| General |
327+ + -- --+----------------+---------+
328+ ```
329+
330+ ### 创建瞬态表
331+
332+ 创建一个瞬态表(临时表),在指定时间段后自动删除数据:
333+
334+ ``` sql
335+ -- 创建瞬态表
336+ CREATE TRANSIENT TABLE visits (
337+ visitor_id BIGINT
338+ );
339+
340+ -- 插入值
341+ INSERT INTO visits VALUES (1 );
342+ INSERT INTO visits VALUES (2 );
343+ INSERT INTO visits VALUES (3 );
344+
345+ -- 检查插入的数据
346+ SELECT * FROM visits;
347+ + -- ---------+
348+ | visitor_id |
349+ + -- ---------+
350+ | 1 |
351+ | 2 |
352+ | 3 |
353+ + -- ---------+
354+ ```
355+
356+ ### 创建表 ... 列 As STORED | VIRTUAL
357+
358+ 以下示例演示了一个带有存储计算列的表,该列根据“price”或“quantity”列的更新自动重新计算:
359+
360+ ``` sql
361+ -- 创建带有存储计算列的表
362+ CREATE TABLE IF NOT EXISTS products (
363+ id INT ,
364+ price FLOAT64,
365+ quantity INT ,
366+ total_price FLOAT64 AS (price * quantity) STORED
367+ );
368+
369+ -- 向表中插入数据
370+ INSERT INTO products (id, price, quantity)
371+ VALUES (1 , 10 .5 , 3 ),
372+ (2 , 15 .2 , 5 ),
373+ (3 , 8 .7 , 2 );
214374
215375-- 查询表以查看计算列
216376SELECT id, price, quantity, total_price
0 commit comments