Oracle primary key和unique key的区别与联系

  • primary key与unique key都是唯一性约束。但二者有很大的区别:   
  • 1.作为primary key的1个或多个列必须为NOT NULL,   
  •   如果建表时此列设为NULL,在增加PRIMARY KEY时,列自动更改为NOT NULL。   
  •   而unique key约束的列可以为null,这是primary key与unique key最大的区别。   
  • 2.一个表只能有一个primary key(单列或多列,多列主键叫联合主键),但可以有多个unique key。   
  • 实例1:   
  • create table t(c1 number(2),c2 date,c3 varchar2(5),c4 int);   
  • desc t;   
  • Name Type        Nullable Default Comments    
  • ---- ----------- -------- ------- --------    
  • C1   NUMBER(2)   Y                            
  • C2   DATE        Y                            
  • C3   VARCHAR2(5) Y                            
  • C4   INTEGER     Y   
  • //   
  • 实例2:添加primary key   
  • alter table t add constraint t_pk primary key(c1,c2);   
  • desc t;   
  • Name Type        Nullable Default Comments    
  • ---- ----------- -------- ------- --------    
  • C1   NUMBER(2)                                
  • C2   DATE                                     
  • C3   VARCHAR2(5) Y                            
  • C4   INTEGER     Y    
  • 我们看到,将c1,c2列设为联合主键后,他们变为not null;   
  • 如果在建表时就指定了主键的话,主键列将会默认为not null。   
  • //   
  • 如果我们在添加一个primary key,那么我们将会得到一个错误:   
  • alter table t add constraint t_pk_2 primary key(c3,c4)   
  • ORA-02260: table can have only one primary key   
  • //   
  • 实例3:添加unique key   
  • alter table t add constraint unique_key_t unique(c3,c4);   
  • 实例4:添加数据   
  • insert into t(c1,c2,c3,c4)   
  • values(10,sysdate,'abc',3);   
  • 1 row inserted   
  • //   
  • insert into t(c1,c2,c3,c4)   
  • values(11,sysdate,'abc',3);   
  • ORA-00001: unique constraint (SCOTT.UNIQUE_KEY_T) violated   
  • 我们看到,添加的第二条数据违反了刚刚创建的唯一键约束;   
  • 将unique_key_t删除,添加就能成功了。   
  • 实例5:删除unique key   
  • alter table t drop constraint unique_key_t;   
  • insert into t(c1,c2,c3,c4)   
  • values(11,sysdate,'abc',3);   
  • 1 row inserted   
  • //   
  • 实例6:删除primary key   
  • alter table t drop constraint t_pk;   
  • Table altered   
  • //   
  • desc t;   
  • Name Type        Nullable Default Comments    
  • ---- ----------- -------- ------- --------    
  • C1   NUMBER(2)   Y                            
  • C2   DATE        Y                            
  • C3   VARCHAR2(5) Y                            
  • C4   INTEGER     Y    
  • 删除主键约束后,c1,c2列由恢复了原来的默认值null。   
  • //   
  • 3.其实primary key也是unique key,被primary key约束的列not null,并且不允许重复   
  • 实例7:   
  • truncate table t;   
  • Table truncated   
  • //   
  • alter table t add constraint t_pk primary key(c1,c2);   
  • Table altered   
  • //   
  • insert into t(c1,c2,c3,c4)   
  • values(1,to_date('2011-01-01','yyyy-mm-dd'),'csdn',10);   
  • 1 row inserted   
  • //   
  • insert into t(c3,c4)   
  • values('china',1);   
  • ORA-01400: cannot insert NULL into ("SCOTT"."T"."C1")   
  • //   
  • insert into t(c1,c2,c3,c4)   
  • values(1,to_date('2011-01-01','yyyy-mm-dd'),'csdn',10);   
  • ORA-00001: unique constraint (SCOTT.T_PK) violated   
  • 这里,我们看到primary key t_pk变成了unique约束,证明了主键约束也是唯一约束。 linux
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
主键(primary key)约束是一种用于唯一标识表中每一行的约束。它确保表中的每一行都具有唯一的标识符,并且不允许为空。主键约束可以由一个或多个列组成,这些列的值必须是唯一的。 外键(foreign key)约束用于建立表之间的关系。它定义了一个列或一组列,这些列的值必须与另一个表中的主键或唯一键的值相匹配。外键约束可以确保数据的完整性,防止无效的引用和维护表之间的关联。 唯一性(unique)约束用于确保表中的某一列或一组列的值是唯一的。唯一性约束可以防止重复的值出现在列中,但允许空值。 检查(check)约束用于限制列中的值必须满足指定的条件。检查约束可以是简单的比较运算符,也可以是复杂的表达式。它可以用于限制列中的值的范围、数据类型或其他条件。 以下是一个示例,演示了如何在Oracle数据库中创建主键约束、外键约束、唯一性约束和检查约束: 1. 创建主键约束: ```sql CREATE TABLE employees ( employee_id INT PRIMARY KEY, employee_name VARCHAR(50) ); ``` 2. 创建外键约束: ```sql CREATE TABLE orders ( order_id INT PRIMARY KEY, customer_id INT, order_date DATE, FOREIGN KEY (customer_id) REFERENCES customers(customer_id) ); ``` 3. 创建唯一性约束: ```sql CREATE TABLE products ( product_id INT PRIMARY KEY, product_name VARCHAR(50), product_code VARCHAR(10) UNIQUE ); ``` 4. 创建检查约束: ```sql CREATE TABLE students ( student_id INT PRIMARY KEY, student_name VARCHAR(50), age INT CHECK (age >= 18) ); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值