主键与唯一索引

1.主键一定是唯一性索引,唯一性索引并不一定就是主键;
2.一个表中可以有多个唯一性索引,但只能有一个主键;
3.主键列不允许空值,而唯一性索引列允许空值。

 

唯一索引
唯一索引不允许两行具有相同的索引值。
如果现有数据中存在重复的键值,则大多数数据库都不允许将新创建的唯一索引与表一起保存。当新数据将使表中的键值重复时,数据库也拒绝接受此数据。例如,如果在 employee 表中的职员姓氏(lname) 列上创建了唯一索引,则所有职员不能同姓。

唯一索引使用create unique index命令完成,能标识数据库中一行的关键字.
在数据字典中建立了唯一索引.

主键索引
主键索引是唯一索引的特殊类型。
数据库表通常有一列或列组合,其值用来唯一标识表中的每一行。该列称为表的主键。
在数据库关系图中为表定义一个主键将自动创建主键索引,主键索引是唯一索引的特殊类型。主键索引要求主键中的每个值是唯一的。当在查询中使用主键索引时,它还允许快速访问数据。

它们的一些比较:
(1)对于主健/unique constraint , oracle/sql server/mysql等都会自动建立唯一索引;
(2)主键不一定只包含一个字段,所以如果你在主键的其中一个字段建唯一索引还是必要的;
(3)主健可作外健,唯一索引不可;
(4)主健不可为空,唯一索引可;
(5)主健也可是多个字段的组合;
(6)主键与唯一索引不同的是:
a.有not null属性;
b.每个表只能有一个。

主键使用primary key来指定,能标识数据库表中一行的关键字.

在数据字典中也建立了唯一索引名字.

<think>好的,我现在需要解决用户关于Kingbase数据库主键唯一索引的is_nullable属性的区别问题。首先,我需要回忆一下之前用户的问题和我的回答,确保这次回答能保持一致并参考已有的引用内容。 用户之前询问了关于Kingbase SE的ORDER BY子句,涉及到索引、分区表以及主键的创建方法。现在用户转向主键唯一索引的is_nullable属性的区别。根据提供的引用,特别是引用[1]和[4],可以看出Kingbase在处理主键唯一索引时有一些限制和特定的语法要求。 首先,主键数据库中的作用是唯一标识表中的每一行,因此主键列必须是非空的,并且值必须唯一。而唯一索引则是确保列中的值唯一,但允许有空值(除非特别指定)。用户提到的is_nullable属性应该是指列是否允许为NULL,这在主键唯一索引中可能有不同的处理方式。 根据引用[1],Kingbase的分区表不支持通过创建唯一索引然后添加主键的方式,需要使用ONLY关键字来创建索引。这可能意味着在分区表的情况下,主键的约束更加严格,而唯一索引可能需要更多的配置。引用[4]中的函数GET_COL_UNIQUES可能用于获取唯一索引和子分区键的信息,这可能涉及到如何检查列的约束情况。 接下来,我需要确认主键唯一索引NULL值处理上的具体差异。主键列默认不允许NULL值,而唯一索引可以包含NULL值,除非显式地设置为NOT NULL。例如,在创建表时,主键会自动将列设置为NOT NULL,而唯一索引需要手动添加NOT NULL约束才能禁止NULL值。 另外,用户可能关心的是在实际使用中,如何通过系统视图或函数来查看这些属性。例如,sys_constraint或sys_index视图可能包含相关信息。根据引用[4],sys_constraint表中contype='u'表示唯一约束,这可能唯一索引相关联。而主键的约束类型可能是'p',对应的列自然不允许NULL。 需要注意的是,在Kingbase中,主键唯一索引在底层实现上可能有所不同。主键会自动创建一个唯一索引,但该索引的列必须是非空的。而手动创建的唯一索引可以选择是否允许NULL值,这取决于列的定义。例如,如果某列允许NULL,那么即使有唯一索引,该列也可以有多个NULL值,但非NULL值必须唯一。 此外,用户可能在实际操作中遇到问题,例如在分区表上创建主键时,必须遵循特定的语法,否则会出现错误,如引用[1]所述。而唯一索引的创建可能更灵活,但需要处理NULL值的情况。 总结来说,主键的is_nullable属性为NO,而唯一索引的is_nullable属性取决于列定义。主键隐式包含NOT NULL约束,而唯一索引需要显式设置。需要验证这些结论是否正确,并参考Kingbase的官方文档或系统表结构来确认。</think>### Kingbase主键唯一索引的is_nullable属性区别 在Kingbase数据库中,主键约束唯一索引在`NULL`值处理上存在本质差异,具体区别如下: --- #### 一、主键约束的`NULL`限制 1. **强制非空性** - 主键列**隐式包含`NOT NULL`约束**,所有主键字段的`is_nullable`属性**必须为`NO`**。 - 尝试插入`NULL`值到主键列会直接报错: ```sql -- 创建主键 CREATE TABLE users ( id INT PRIMARY KEY, -- id列的is_nullable自动设为NO name VARCHAR(50) ); ``` 2. **系统实现验证** - 通过系统表`sys_attribute`可验证字段是否允许空值: ```sql SELECT attname, attnotnull FROM sys_attribute WHERE attrelid = 'users'::regclass AND attname = 'id'; ``` > 结果中`attnotnull=true`表示禁止空值[^1]。 --- #### 二、唯一索引的`NULL`处理 1. **默认允许空值** - 唯一索引字段的`is_nullable`属性**取决于列定义**,允许存在`NULL`值。 - 唯一性约束仅作用于非空值,允许多行包含`NULL`: ```sql -- 创建允许NULL唯一索引 CREATE TABLE products ( code VARCHAR(20) UNIQUE, -- code列的is_nullable默认为YES price NUMERIC ); -- 允许插入多个NULL值 INSERT INTO products VALUES (NULL, 100), (NULL, 200); -- 成功 ``` 2. **显式禁止空值** - 若需禁止空值,需**手动添加`NOT NULL`约束**: ```sql ALTER TABLE products ALTER COLUMN code SET NOT NULL; ``` --- #### 三、对比总结 | 特性 | 主键约束 | 唯一索引 | |---------------------|-----------------------------|-----------------------------| | `is_nullable`属性 | 强制`NO`(系统自动设置) | 由列定义决定(默认允许`YES`)| | 空值数量限制 | 完全禁止空值 | 允许多个`NULL`共存 | | 约束范围 | 全表唯一 + 非空 | 仅非空值唯一 | | 索引类型 | 自动创建唯一索引(非空) | 可独立创建(允许空值) | --- #### 四、特殊场景验证 1. **分区表的限制** - 在分区表中创建主键时,需使用`ONLY`关键字避免隐式约束冲突[^1]: ```sql CREATE UNIQUE INDEX ON ONLY parent_table (id); ``` 2. **系统恢复场景** - 使用`sys_restore`恢复表结构时,主键约束会被保留,但唯一索引需通过参数指定恢复[^2]。 --- ### 相关问题 1. 如何查询Kingbase中所有表的`is_nullable`属性? 2. 分区表主键普通表主键在约束实现上有何差异? 3. 为什么唯一索引允许存在多个`NULL`值? 4. 如何通过系统视图验证主键唯一索引的约束关系? --- ### 引用说明 [^1]: 分区表主键创建语法限制`ONLY`关键字的使用 [^2]: `sys_restore`工具对索引恢复的默认行为说明
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值