kingbase和oracle多列唯一索引null值处理差异

kingbase和oracle多列唯一索引null值处理差异

测试sql

create  table test(c1 numeric(20),c2 varchar(20),c3 varchar(20));
create unique index idx_test on test(c1,c2,c3) ;
insert into test values(1,1,null);
insert into test values(1,1,null);

在kingbase中:记录(1,1,null)和记录(1,1,null)视为不同
01
在oracle中:记录(1,1,null)和记录(1,1,null)视为相同
02

关于索引null值存储:
oracle的单列索引不存null,多列索引当全部索引列都为null时则也不存储,只要有一个索引列不为null,则都会存储
kingbase里是都会存储null
所以oracle里is null条件走不了索引,而kingbase里面能走索引,但是kingbase里会多耗存储空间

### 将 Oracle 建表语句转换为 Kingbase 兼容的 SQL 语法 由于 KingbaseES 提供了大量的 Oracle 兼容特性,大多数 Oracle数据库对象 SQL 语句可以直接移植到 KingbaseES 中而无需任何转换[^1]。然而,在某些情况下可能仍需调整特定于 Oracle 的功能或关键字。 #### 示例:OracleKingbase 的建表语句转换 假设有一个简单的 Oracle 表定义如下: ```sql CREATE TABLE employees ( employee_id NUMBER(6), first_name VARCHAR2(20), last_name VARCHAR2(25) NOT NULL, email VARCHAR2(25) NOT NULL UNIQUE, hire_date DATE NOT NULL, job_id VARCHAR2(10) NOT NULL, salary NUMBER(8,2) ); ``` 对于上述 Oracle 创建表格的语句,在迁移到 KingbaseES 时几乎不需要修改,因为两者支持的数据类型非常相似。只需确保使用的数据类型名称符合 KingbaseES 的标准即可。以下是适用于 KingbaseES 的等效创建表语句: ```sql CREATE TABLE employees ( employee_id INTEGER, -- 使用INTEGER代替NUMBER(6),除非特别需要精度控制 first_name VARCHAR(20), -- VARCHAR可替代VARCHAR2 last_name VARCHAR(25) NOT NULL, email VARCHAR(25) NOT NULL UNIQUE, hire_date TIMESTAMP NOT NULL, -- 推荐使用TIMESTAMP而非DATE以获得更精确的时间戳存储 job_id VARCHAR(10) NOT NULL, salary NUMERIC(8,2) -- NUMERIC通常被推荐用于货币或其他数型字段 ); ``` 需要注意的是 `NUMBER` 类型在 Oracle KingbaseES 中有不同的实现细节;因此建议根据实际需求选择合适的数据类型来表示整数 (`INTEGER`) 或者带有小数位的数字(`NUMERIC`)。 另外,虽然这里展示的例子相对简单,但在处理复杂结构如索引、约束条件或是触发器的时候,则应该仔细查阅官方文档确认是否存在差异并做相应调整。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值