SAP HANA 修改表(alter table)的操作

本文详细介绍了如何在HANA数据库中执行常见的表结构修改操作,包括添加字段、修改字段类型、重命名、注释、修改表名、主键管理等,同时涵盖了预加载优化、外键约束设置以及系统版本控制等高级特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 平常常用的修改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;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值