更改表
ALTER TABLE 语句通过修改、添加或删除列和约束来更改表的定义。ALTER TABLE 语句有两种类型:
- 那些不改变表布局格式而只是使用重命名操作的。
- 那些改变表格式的。这些操作通常需要相对较长的时间,因为数据库运行时会创建一个新表,并将所有数据从原表移动到新创建的表中。
语法定义如下:
ALTER TABLE name action {"," action }
action:
RENAME TO new_table_name
RENAME [ COLUMN ] old_column_name TO new_column_name
ADD [ COLUMN ] column_name column_spec
ADD CONSTRAINT constraint_name table_constraint
DROP [ COLUMNS ] column_name
DROP CONSTRAINT constraint_name
ALTER [ COLUMN ] column_name TYPE column_spec
SET [ NOT ] TEMPORARY
table_constraint:
PRIMARY KEY "(" column_name [ "," ... ] ")" |
FOREIGN KEY "(" column_name [ "," ... ] ")" references |
UNIQUE "(" column_name [ "," ... ] ")"
column_spec:
data_type [ column_constraint ]
column_constraint:
PRIMARY KEY |
UNIQUE |
USING [ HASH | RTREE | TRIGRAM | INCLUSIVE | BTREE ] INDEX
[ FOREIGN KEY ] references
[ NOT ] NULL
references:
REFERENCES table [ "(" columns ")" ]
请注意,REFERENCES 子句会告知 SQL 引擎存在一个外键约束。但参照完整性并非由 SQL 引擎强制执行。
另外,请注意在 SmartESQL 中,所有 SQL 关键字均不区分大小写——即 ALTER TABLE 和 alter table 是等效的。
调整字典内存空间
当我们调整数据库的字典内存空间时,需要注意一些细节。当您删除或修改表时,数据库引擎不会完全清除这些表在字典中的所有记录。虽然剩余的内存占用很小(大约 50 字节),但如果您预计会频繁进行表的修改或删除操作,或者您的应用程序会动态创建大量非 B 树索引(如哈希索引),我们建议您为字典预留更多的空间。例如,在使用 xSQL 时,可以通过调整配置文件中的 db_params:additional_heap_size 参数来增加额外的堆空间。
非 SQL 应用程序警告
对于非 SQL 应用程序,如果您的应用程序是基于静态模式构建的,并且通过 ALTER TABLE 或其他方式进行了更改,请务必避免通过除 SQL 以外的 API 打开与持久数据库的事务。这样做可以确保数据库运行时能够保持数据的一致性。如果检测到模式发生了更改,事务可能会返回 MCO_E_SCHEMA_CHANGED 错误代码,这可能导致应用程序读取错误或过时的数据。为了确保非 SQL 应用程序能够顺利使用新的模式,建议根据所使用的 API 保存并重新处理或重新加载新模式。(有关详细信息,请参阅“更改数据库模式”主题。)