平常常用的修改hana表的语句
--增加表字段
alter table table_name add(source_sys smallint,load_date date);
--将修改表字段类型
alter table table_name alter(load_date timestamp);
--修改表字段名称
rename column table_name.load_date to load_time;
--增加注释-表
comment on table table_name is '表名';
--增加注释-字段名
comment on column table_name.source_sys is '来源系统';
--修改表名
rename table table_name1 to table_name2
--修改默认值
ALTER TABLE table_name ALTER (b INT DEFAULT 10);
--删除主键(删除数据)
alter table table_name drop primary key
--增加主键
ALTER TABLE table_name ADD CONSTRAINT prim_key PRIMARY KEY (a, b);
--行表改成列表
ALTER TABLE table_name COLUMN;
但实际上,在HANA官方文档中,修改表参数是非常丰富的。
ALTER TABLE <table_name>
[<add_columns_clause>]
[<alter_columns_clause>]
[<drop_columns_clause>]
[<system_versioning_configuration>]
[<add_drop_application_time_period>]
[<lob_reorganize_clause>]
[<clear_column_join_data_statistics_clause>]
[<add_constraint_clause>]
[<alter_constraint_enforcement_clause>]
[<drop_primary_key_clause>]
[<drop_constraint_clause>]
[<preload_clause>]
[<table_conversion_clause>]
[<add_association_clause>]
[<drop_association_clause>]
[<with_annotation_clause>]
[<partition_clauses>]
[<load_unit>]
[<alter_persistent_memory_spec_clause>]
[<replica_clauses>]
[<persistent_merge_option>]
[<redo_log_option>]
[<auto_merge_option>]
[<unload_priority>]
[<schema_flexibility_option>]
[<trigger_option>]
[<set_group_option>]
[<unset_group_option>]
[<set_row_order>]
[<unset_row_order>]
[<unused_retention_period>]
[<reclaim_data_space_clause>]
[<series_reorganize_clause>]
[<owner_to_clause>]
[<alter_mask_settings_clause>]
[<clientside_encryption_clauses>]
[<set_movable_clause>]
[<convert_index_type>]
[<numa_node_preference_clause>]
这里仅作几个介绍,更多的内容可以查看官方文档
预加载
数据库中预加载(Preload)的概念和用法。
预加载是一种优化技术,可以提高数据库查询的效率。当预加载标志被设置后,指定的表或列会在数据库服务器(这里的索引服务器)启动后自动加载进内存。这样,当我们查询这些表或列时,数据已经在内存中,不需要再从硬盘读取,从而大大提高了查询速度。这个设置对列存储表特别有用,因为列存储表的数据分布在硬盘的不同位置,预加载可以减少硬盘的随机读取。
具体来说,有以下几种预加载的设置:
PRELOAD ALL
:设置表中所有列的预加载标志PRELOAD (<column_name>)
:设置指定列的预加载标志PRELOAD NONE
:从所有列移除预加载标志另外,你可以在系统表中查看预加载标志的当前状态。可能的值有TRUE(表示启用预加载)、FALSE(表示未启用预加载)和NULL(表示行存储、虚拟列或者扩展存储的表,这些表无法进行预加载)。
在表t上设置列b和列c的预加载标志。
ALTER TABLE t PRELOAD (b, c);
卸载优先级
设置数据库表从内存中卸载的优先级。
当内存空间不足时,系统会根据这个优先级来决定先卸载哪些表的数据。
UNLOAD PRIORITY <unload_priority>
这个命令就是用来设置卸载优先级的,其中<unload_priority>
是一个数字,可以是0到9。数字越大,表示卸载的优先级越高,也就是说,当系统需要回收内存空间时,优先级为9的表会被最先卸载。反之,如果优先级为0,那么表的数据就不会被卸载,除非在特殊情况下。
结合这个例子
ALTER TABLE t UNLOAD PRIORITY 2;
,这条命令的意思就是将表t
的卸载优先级设置为2。这意味着当内存空间不足时,系统会优先卸载优先级更高(数字更大)的表,表t
的数据会被相对保留较长的时间。
将表t的卸载优先级更改为2。
ALTER TABLE t UNLOAD PRIORITY 2;
掩码处理
数据掩码是一种保护敏感信息的技术,它将原始数据替换为随机字符或者其他不可识别的形式,从而防止敏感数据被未经授权的人查看。在这个例子中,可能是因为"SSN"列中包含了敏感信息(如个人的社会安全号码),所以需要进行数据掩码处理。
修改Personal_Information表,对SSN列使用掩码处理。
ALTER TABLE PERSONAL_INFORMATION ADD MASK (SSN USING '****');
修改Personal_Information表,取消对SSN列的掩码处理。
ALTER TABLE PERSONAL_INFORMATION DROP MASK (SSN);
外键约束
创建两个数据库表,然后在其中一个名为REFERENCING_T的表上添加一个外键约束。
在数据库中,外键是一种约束,用于保证数据的一致性和完整性。它是一个表中的字段,它的值是另一个表的主键。这种关系称为外键关系,通过这种关系,两个表可以相互关联。
所以,这句话的意思就是在REFERENCING_T表上创建一个新的外键,这个外键会引用另一个表中的主键。这样,当我们在REFERENCING_T表中插入或更新数据时,系统会检查这个外键字段的值是否存在于被引用表的主键中,如果不存在,那么操作就会失败,从而保证了数据的一致性。
这段文字的内容包含了一系列数据库操作的例子:
1. 首先,创建了两个表:REFERENCED_T和REFERENCING_T。在REFERENCING_T表上,A列被设置为外键,引用了REFERENCED_T表的A列。
CREATE COLUMN TABLE REFERENCED_T ( A INT PRIMARY KEY, B INT);
CREATE COLUMN TABLE REFERENCING_T (A INT, B INT);
ALTER TABLE REFERENCING_T ADD CONSTRAINT fk1 FOREIGN KEY(A) REFERENCES REFERENCED_T(A);
2. 向这两个表插入数据,然后尝试插入一条违反外键约束的数据,这会导致插入失败。
INSERT INTO REFERENCED_T VALUES (1, 1);
INSERT INTO REFERENCING_T VALUES (1, 1);
INSERT INTO REFERENCING_T VALUES (2, 1); -- 这条语句会失败
3. 修改REFERENCING_T表,使得外键约束不被强制执行,这样违反约束的插入语句就可以成功了。
ALTER TABLE REFERENCING_T ALTER CONSTRAINT fk1 NOT ENFORCED;
INSERT INTO REFERENCING_T VALUES (2, 1); -- 这条语句现在可以成功
4. 创建一个名为R的表,并添加一个唯一约束UK,然后删除这个约束。
CREATE ROW TABLE R (A INT PRIMARY KEY, B NVARCHAR(10));
ALTER TABLE R ADD CONSTRAINT UK UNIQUE (B);
ALTER TABLE R DROP CONSTRAINT UK;
5. 创建一个名为S的表,并添加一个引用R表的外键约束,设定了删除级联选项,也就是说,如果R表中的数据被删除,相应的S表中的数据也会被删除。
CREATE ROW TABLE S (FA INT, B NVARCHAR(10));
ALTER TABLE S ADD CONSTRAINT FK FOREIGN KEY(FA) REFERENCES R(A) ON DELETE CASCADE;
6. 创建一个名为account的表和它的历史表account_history,然后为account表启用系统版本控制,这样可以追踪account表的历史数据。
CREATE COLUMN TABLE account (
account_id INT PRIMARY KEY,
account_owner_id NVARCHAR(10),
account_balance DOUBLE
);
CREATE COLUMN TABLE account_history (
account_id INT,
account_owner_id NVARCHAR(10),
account_balance DOUBLE,
valid_from TIMESTAMP NOT NULL,
valid_to TIMESTAMP NOT NULL
);
ALTER TABLE account ADD (valid_from TIMESTAMP NOT NULL GENERATED ALWAYS AS ROW START);
ALTER TABLE account ADD (valid_to TIMESTAMP NOT NULL GENERATED ALWAYS AS ROW END);
ALTER TABLE account ADD PERIOD FOR SYSTEM_TIME(valid_from, valid_to);
ALTER TABLE account ADD SYSTEM VERSIONING HISTORY TABLE account_history;