Oracle兼容-语法-EXTERNAL TABLE
GreatSQL中支持外部表特性。
外部表是指不存在于数据库中的表,通过向数据库提供描述外部表的元数据,可以把一个操作系统文件当成一个只读的数据库表,就像这些数据存储在一个普通数据库表中一样来进行访问。
1. 语法
1. CREATE TABLE xxx( )
2. ORGANIZATION EXTERNAL
3. (
4. [ DEFAULT DIRECTORY 'text' ]
5. [ LOCATION
6. ([ directory: ] 'location_specifier' )
7. ]
8. )
参数说明:
DEFAULT DIRECTORY:外部文件所在操作系统上的存储路径。LOACATION:定义了外部表源文件位置,可由目录和文件名组成,数据文件命名后缀必须是*.csv或*.CSV。当指定源文件位置包含目录信息时,则DEFAULT DIRECTORY参数不生效;否则会在DEFAULT DIRECTORY参数指向的目录下读取源文件。
2. 定义和用法
外部表目前只支持外部CSV格式文件数据,是在 CSV 引擎基础上新增 DLK 引擎来管理外部表。
外部表数据源位于文件系统之中,只有CSV格式文件可以作为外部表的数据源。
可以通过SQL语句来访问外部表,无需事先装载表数据装。
对外部表只能进行 SELECT 只读查询,不能执行有修改数据的 DML 操作(INSERT、UPDATE、DELETE),也不能创建索引。
外部表中的列定义不能支持NULL,读取外部文件数据时也无法有效识别空列。
3. Oracle兼容说明
当前GreatSQL和Oracle外部表功能的主要区别有以下几点:
- GreatSQL外部表不需要设置安全目录。
- GreatSQL外部表只能指定单个文件,不支持多个数据文件导入。
- GreatSQL外部表不能指定外部文件的读取格式。
- GreatSQL外部表不能设定外部文件的访问驱动接口。
4. 示例
-
- 先准备好源文件
1. $ cat /data/external/extt.CSV
3. 1,"c2_row1","c3_row1"
4. 2,"c2_row2","c3_row2"
5. 3,"c2_row3","c3_row3"
6. 4,"c2_row4","c3_row4"
7. 5,"c2_row5","c3_row5"
8. 6,"c2_row6","c3_row6"
-
- 创建外部表
采用以下几种不同方式都可以创建外部表:
1. -- 1. 分别定义DEFAULT DIRECTORY和LOCATION
2. greatsql> CREATE TABLE extt_t1 (
3. c1 INT NOT NULL,
4. c2 VARCHAR(10) NOT NULL,
5. c3 CHAR(20) NOT NULL)
6. ORGANIZATION EXTERNAL(
7. DEFAULT DIRECTORY '/data/external'
8. LOCATION ('extt.csv'));
10. -- 2. LOCATION已经指定完整路径
11. greatsql> CREATE TABLE extt_t2 (
12. c1 INT NOT NULL,
13. c2 VARCHAR(10) NOT NULL,
14. c3 CHAR(20) NOT NULL)
15. ORGANIZATION EXTERNAL (
16. LOCATION ( '/data/external' : 'extt.csv'));
18. -- 3. LOCATION已经指定完整路径,忽略DEFAULT DIRECTORY参数
19. greatsql> CREATE TABLE extt_t3 (
20. c1 INT NOT NULL,
21. c2 VARCHAR(10) NOT NULL,
22. c3 CHAR(20) NOT NULL)
23. ORGANIZATION EXTERNAL(
24. DEFAULT DIRECTORY '/tmp'
25. LOCATION ('/data/external' : 'extt.csv'));
27. greatsql> SELECT * FROM extt_t1;
28. +----+---------+---------+
29. | c1 | c2 | c3 |
30. +----+---------+---------+
31. | 1 | c2_row1 | c3_row1 |
32. | 2 | c2_row2 | c3_row2 |
33. | 3 | c2_row3 | c3_row3 |
34. | 4 | c2_row4 | c3_row4 |
35. | 5 | c2_row5 | c3_row5 |
36. | 6 | c2_row6 | c3_row6 |
37. +----+---------+---------+
38. 6 rows in set (0.00 sec)
40. -- 三个表checksum一致
41. greatsql> CHECKSUM TABLE extt_t1, extt_t2, extt_t3;
42. +------------------+------------+
43. | Table | Checksum |
44. +------------------+------------+
45. | greatsql.extt_t1 | 1347810397 |
46. | greatsql.extt_t2 | 1347810397 |
47. | greatsql.extt_t3 | 1347810397 |
48. +------------------+------------+
-
- 访问和管理外部表
1. -- 1. 查看表DDL
2. -- 另外两个外部表的DDL也一样
3. greatsql> SHOW CREATE TABLE extt_t1\G
4. *************************** 1. row ***************************
5. Table: extt_t1
6. Create Table: CREATE TABLE `extt_t1` (
7. `c1` int NOT NULL,
8. `c2` varchar(10) NOT NULL,
9. `c3` char(20) NOT NULL
10. ) ORGANIZATION EXTERNAL ( LOCATION ( '/data' : 'extt.csv'))
12. -- 2. 删除外部表
13. greatsql> DROP TABLE extt_t1, extt_t2, extt_t3;
14. Query OK, 0 rows affected (0.01 sec)
16. -- 删除全部外部表后,源文件依然存在,不会被同步删除
17. $ ls -la /data/external/extt.csv
18. -rw-r--r-- 1 root root 132 Nov 20 13:35 /data/external/extt.csv
-
- 不支持的外部表操作
外部表不支持的一些操作类型:INSERT、UPDATE、DELETE、ALTER TABLE、TRUNCATE、CREATE INDEX。
1. greatsql> CREATE INDEX idx_c1 ON extt_t1(c1);
2. ERROR 1031 (HY000): Table storage engine for 'extt_t1' doesn't have this option
4. greatsql> ALTER TABLE extt_t1 ADD c4 INT NOT NULL;
5. ERROR 1031 (HY000): Table storage engine for 'extt_t1' doesn't have this option
7. greatsql> ALTER TABLE extt_t1 DROP c3;
8. ERROR 1031 (HY000): Table storage engine for 'extt_t1' doesn't have this option
10. greatsql> DELETE FROM extt_t1;
11. ERROR 1031 (HY000): Table storage engine for 'extt_t1' doesn't have this option
13. greatsql> UPDATE extt_t1 SET c2 = 'row2' WHERE c1 = 2;
14. ERROR 1031 (HY000): Table storage engine for 'extt_t1' doesn't have this option
16. greatsql> TRUNCATE TABLE extt_t1;
17. ERROR 1031 (HY000): Table storage engine for 'extt_t1' doesn't have this option
19. greatsql> INSERT INTO extt_t1 VALUES (7,'c2_row7','c3_row7');
20. ERROR 1031 (HY000): Table storage engine for 'extt_t1' doesn't have this option
5. 外部表数据字典
1. -- 查询ENGINE = 'DLK'的表
2. greatsql> SELECT * FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'greatsql' AND ENGINE = 'DLK';
3. +---------------+--------------+------------+------------+--------+---------+------------+------------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+--------------------+----------+----------------+---------------+
4. | TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME | TABLE_TYPE | ENGINE | VERSION | ROW_FORMAT | TABLE_ROWS | AVG_ROW_LENGTH | DATA_LENGTH | MAX_DATA_LENGTH | INDEX_LENGTH | DATA_FREE | AUTO_INCREMENT | CREATE_TIME | UPDATE_TIME | CHECK_TIME | TABLE_COLLATION | CHECKSUM | CREATE_OPTIONS | TABLE_COMMENT |
5. +---------------+--------------+------------+------------+--------+---------+------------+------------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+--------------------+----------+----------------+---------------+
6. | def | greatsql | extt_t1 | BASE TABLE | dlk | 10 | Dynamic | 2 | 0 | 0 | 0 | 0 | 0 | NULL | 2023-11-20 13:59:06 | NULL | NULL | utf8mb4_0900_ai_ci | NULL | | |
7. | def | greatsql | extt_t2 | BASE TABLE | dlk | 10 | Dynamic | 2 | 0 | 0 | 0 | 0 | 0 | NULL | 2023-11-20 13:59:10 | NULL | NULL | utf8mb4_0900_ai_ci | NULL | | |
8. | def | greatsql | extt_t3 | BASE TABLE | dlk | 10 | Dynamic | 2 | 0 | 0 | 0 | 0 | 0 | NULL | 2023-11-20 13:59:15 | NULL | NULL | utf8mb4_0900_ai_ci | NULL | | |
9. +---------------+--------------+------------+------------+--------+---------+------------+------------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+--------------------+----------+----------------+---------------+
10. 3 rows in set (0.00 sec)
问题反馈
联系我们
扫码关注微信公众号

