1. primary key与unique key都是唯一性约束。但二者有很大的区别:  
  2. 1.作为primary key的1个或多个列必须为NOT NULL,  
  3.   如果建表时此列设为NULL,在增加PRIMARY KEY时,列自动更改为NOT NULL。  
  4.   而unique key约束的列可以为null,这是primary key与unique key最大的区别。  
  5. 2.一个表只能有一个primary key(单列或多列,多列主键叫联合主键),但可以有多个unique key。  
  6. 实例1:  
  7. create table t(c1 number(2),c2 date,c3 varchar2(5),c4 int);  
  8. desc t;  
  9. Name Type        Nullable Default Comments   
  10. ---- ----------- -------- ------- --------   
  11. C1   NUMBER(2)   Y                           
  12. C2   DATE        Y                           
  13. C3   VARCHAR2(5) Y                           
  14. C4   INTEGER     Y  
  15. //  
  16. 实例2:添加primary key  
  17. alter table t add constraint t_pk primary key(c1,c2);  
  18. desc t;  
  19. Name Type        Nullable Default Comments   
  20. ---- ----------- -------- ------- --------   
  21. C1   NUMBER(2)                               
  22. C2   DATE                                    
  23. C3   VARCHAR2(5) Y                           
  24. C4   INTEGER     Y   
  25. 我们看到,将c1,c2列设为联合主键后,他们变为not null;  
  26. 如果在建表时就指定了主键的话,主键列将会默认为not null。  
  27. //  
  28. 如果我们在添加一个primary key,那么我们将会得到一个错误:  
  29. alter table t add constraint t_pk_2 primary key(c3,c4)  
  30. ORA-02260: table can have only one primary key  
  31. //  
  32. 实例3:添加unique key  
  33. alter table t add constraint unique_key_t unique(c3,c4);  
  34. 实例4:添加数据  
  35. insert into t(c1,c2,c3,c4)  
  36. values(10,sysdate,'abc',3);  
  37. 1 row inserted  
  38. //  
  39. insert into t(c1,c2,c3,c4)  
  40. values(11,sysdate,'abc',3);  
  41. ORA-00001: unique constraint (SCOTT.UNIQUE_KEY_T) violated  
  42. 我们看到,添加的第二条数据违反了刚刚创建的唯一键约束;  
  43. 将unique_key_t删除,添加就能成功了。  
  44. 实例5:删除unique key  
  45. alter table t drop constraint unique_key_t;  
  46. insert into t(c1,c2,c3,c4)  
  47. values(11,sysdate,'abc',3);  
  48. 1 row inserted  
  49. //  
  50. 实例6:删除primary key  
  51. alter table t drop constraint t_pk;  
  52. Table altered  
  53. //  
  54. desc t;  
  55. Name Type        Nullable Default Comments   
  56. ---- ----------- -------- ------- --------   
  57. C1   NUMBER(2)   Y                           
  58. C2   DATE        Y                           
  59. C3   VARCHAR2(5) Y                           
  60. C4   INTEGER     Y   
  61. 删除主键约束后,c1,c2列由恢复了原来的默认值null。  
  62. //  
  63. 3.其实primary key也是unique key,被primary key约束的列not null,并且不允许重复  
  64. 实例7:  
  65. truncate table t;  
  66. Table truncated  
  67. //  
  68. alter table t add constraint t_pk primary key(c1,c2);  
  69. Table altered  
  70. //  
  71. insert into t(c1,c2,c3,c4)  
  72. values(1,to_date('2011-01-01','yyyy-mm-dd'),'csdn',10);  
  73. 1 row inserted  
  74. //  
  75. insert into t(c3,c4)  
  76. values('china',1);  
  77. ORA-01400: cannot insert NULL into ("SCOTT"."T"."C1")  
  78. //  
  79. insert into t(c1,c2,c3,c4)  
  80. values(1,to_date('2011-01-01','yyyy-mm-dd'),'csdn',10);  
  81. ORA-00001: unique constraint (SCOTT.T_PK) violated  
  82. 这里,我们看到primary key t_pk变成了unique约束,证明了主键约束也是唯一约束