2017-05-08 65 views
0
CREATE TABLE buses(Bus_no NUMBER(11) NOT NULL ,Bus_name Varchar2(20),Type VARCHAR2(20),Total_seats Number(11),Avail_seats Number(11)); 
ALTER TABLE buses 
ADD CONSTRAINT PK_BUSES UNIQUE(Bus_no); 

这是我需要创建..表,这应该是输出:如何在oracle上添加主键约束?

Name      Null? Type 
----------------------------------------- -------- ---------------------------- 
BUS_NO     NOT NULL NUMBER(11) 
BUS_NAME      VARCHAR2(20) 
TYPE       VARCHAR2(20) 
TOTAL_SEATS      NUMBER(11) 
AVAIL_SEATS      NUMBER(11) 

CONSTRAINT_NAME 
------------------------------ 
PK_BUSES 

但是我得到这个额外的行SYS-C00403053与我的输出表一起,请帮忙删除此。

CONSTRAINT_NAME 
------------------------------ 
SYS_C00403053 
PK_BUSES 

回答

2

你还没有添加主键,你已经添加了一个唯一的约束。虽然唯一约束和非空约束实际上是相同的,但它们实际上不是实际的主键相同。

正如@GurwinderSingh所说,SYS_C00403053是非空约束的系统生成名称。这是可能的,但不寻常的,仅举一个非空约束:

-- just to clean up what you have in the question, remove the unique constraint 
ALTER TABLE buses DROP CONSTRAINT PK_BUSES; 

ALTER TABLE buses MODIFY Bus_no NULL; 

ALTER TABLE buses MODIFY Bus_no CONSTRAINT BUS_NO_NOT_NULL NOT NULL; 

desc buses 

Name  Null? Type   
----------- -------- ------------ 
BUS_NO  NOT NULL NUMBER(11) 
BUS_NAME    VARCHAR2(20) 
TYPE     VARCHAR2(20) 
TOTAL_SEATS   NUMBER(11) 
AVAIL_SEATS   NUMBER(11) 

select constraint_name, constraint_type, search_condition 
from user_constraints where table_name = 'BUSES'; 

CONSTRAINT_NAME    C SEARCH_CONDITION                 
------------------------------ - -------------------------------------------------------------------------------- 
BUS_NO_NOT_NULL    C "BUS_NO" IS NOT NULL                

但是当你想要一个主键,无论如何,你可以将单独的非空检查,因为它是由一个(适当的)暗示主关键:

ALTER TABLE buses MODIFY Bus_no NULL; 

ALTER TABLE buses ADD CONSTRAINT PK_BUSES PRIMARY KEY (Bus_no); 

desc buses 

Name  Null? Type   
----------- -------- ------------ 
BUS_NO  NOT NULL NUMBER(11) 
BUS_NAME    VARCHAR2(20) 
TYPE     VARCHAR2(20) 
TOTAL_SEATS   NUMBER(11) 
AVAIL_SEATS   NUMBER(11) 

select constraint_name, constraint_type, search_condition 
from user_constraints where table_name = 'BUSES'; 

CONSTRAINT_NAME    C SEARCH_CONDITION                 
------------------------------ - -------------------------------------------------------------------------------- 
PK_BUSES      P                     

现在,您只看到如果您尝试插入空主键约束列,但该列仍被标记为不可为空,你会得到同样的错误:

insert into buses (bus_no) values (null); 

ORA-01400: cannot insert NULL into ("MY_SCHEMA"."BUSES"."BUS_NO") 
+0

它的工作!非常感谢!! –

1

SYS_C00403053是给予NOT NULL约束上Bus_no列中的系统生成的名称。您的结果与预期一致。