oracle将列更改为唯一

时间:2013-10-04 10:58:50

标签: oracle oracle11g unique-constraint

表已在系统中以这种方式创建

CREATE TABLE INSTANCES
(
    DM  INTEGER  NOT NULL,
    INSTANCEID  VARCHAR2(512)  NOT NULL,
    INSTANCENAME  VARCHAR2(64)  NOT NULL  UNIQUE,
    HOSTNAME  VARCHAR2(32)  NOT NULL,
    CONSTRAINT  PK_INSTANCES  PRIMARY KEY  (INSTANCEID, HOSTNAME)
);

新的克里特岛语句如下:

CREATE TABLE INSTANCES
(
    DM  INTEGER  NOT NULL,
    INSTANCEID  VARCHAR2(512)  NOT NULL  UNIQUE,
    INSTANCENAME  VARCHAR2(64)  NOT NULL  UNIQUE,
    HOSTNAME  VARCHAR2(32)  NOT NULL,
    CONSTRAINT  PK_INSTANCES  PRIMARY KEY  (INSTANCEID, HOSTNAME)
);

不同之处在于INSTANCEID具有独特性。我怎样改变桌子?我使用了以下声明,但它对我不起作用。

ALTER TABLE INSTANCES ADD CONSTRAINT ab UNIQUE ( INSTANCEID);

它出错了: ALTER TABLE INSTANCES添加约束ab UNIQUE(INSTANCEID) 错误报告: SQL错误:ORA-02261:表中已存在此类唯一键或主键 02261. 00000 - “表中已存在此类唯一或主键” *原因:不言而喻。 *动作:删除额外的密钥。

请帮我改变上面的要求。谢谢!

这是SELECT con.constraint_name,col.column_name,con.constraint_type的输出   FROM user_cons_columns col     JOIN user_constraints con ON(col.constraint_name = con.constraint_name) WHERE col.table_name ='INSTANCES';

"CONSTRAINT_NAME","COLUMN_NAME","CONSTRAINT_TYPE" 
"SYS_C0016531","DM","C" 
"SYS_C0016532","INSTANCEID","C" 
"SYS_C0016533","INSTANCENAME","C" 
"SYS_C0016534","HOSTNAME","C" 
"PK_INSTANCES","HOSTNAME","P" 
"PK_INSTANCES","INSTANCEID","P" 
"SYS_C0016536","INSTANCENAME","U"

1 个答案:

答案 0 :(得分:0)

您已经声明INSTANCEID应该是UNIQUE,因此已经创建了一个约束。

CREATE TABLE INSTANCES
(
    DM  INTEGER  NOT NULL,
    INSTANCEID  VARCHAR2(512)  NOT NULL  UNIQUE, -- UNIQUE constraint
    INSTANCENAME  VARCHAR2(64)  NOT NULL  UNIQUE,
    HOSTNAME  VARCHAR2(32)  NOT NULL,
    CONSTRAINT  PK_INSTANCES  PRIMARY KEY  (INSTANCEID, HOSTNAME)
);

修改:好的,在阅读完您的评论后,请尝试以下操作:

SELECT con.constraint_name, col.column_name, con.constraint_type
  FROM user_cons_columns col
    JOIN user_constraints con ON (col.constraint_name = con.constraint_name)
WHERE col.table_name = 'INSTANCES'
  AND con.constraint_type = 'U'
;

它将列出INSTANCE表的UNIQUE约束和关联列。请检查INSTANCEID列是否存在唯一约束(如果该约束没有其他关联列)。

SQLFiddle上的示例:http://sqlfiddle.com/#!4/43b43/6

编辑#2 :创建命名约束,所有选项:

-- CREATE TABLE - "In Line" Constraints

CREATE TABLE ports (
  ID NUMBER CONSTRAINT PORT_ID_PK PRIMARY KEY,
  NAME VARCHAR2(20)
);

CREATE TABLE ports (
  ID NUMBER,
  NAME VARCHAR2(20) CONSTRAINT NAME_NN NOT NULL
);

CREATE TABLE ports (
  ID NUMBER,
  NAME VARCHAR2(20) CONSTRAINT NAME_UQ UNIQUE
);

CREATE TABLE ports (
  ID NUMBER,
  STATUS NUMBER CONSTRAINT PROPER_STATUS_CK
    CHECK (STATUS IN (4, 5))
);

CREATE TABLE ships (
  SHIP_ID NUMBER,
  NAME VARCHAR2(20),
  HOME_PORT_ID NUMBER CONSTRAINT SHIP_PORT_FK
    REFERENCES PORTS (ID)
);


-- CREATE TABLE - "Out of Line" Constraints

CREATE TABLE ports (
  ID NUMBER,
  NAME VARCHAR2(20),
  CONSTRAINT PORT_ID_PK PRIMARY KEY (ID)
);

-- NOT NULL constraints can not be created "Out of Line"!

CREATE TABLE ports (
  ID NUMBER,
  NAME VARCHAR2(20),
  CONSTRAINT NAME_UQ UNIQUE (NAME)
);

CREATE TABLE ports (
  ID NUMBER,
  STATUS NUMBER,
  CONSTRAINT PROPER_STATUS_CK
    CHECK (STATUS IN (4, 5))
);

CREATE TABLE ships (
  SHIP_ID NUMBER,
  NAME VARCHAR2(20),
  HOME_PORT_ID NUMBER,
  CONSTRAINT SHIP_PORT_FK FOREIGN KEY
    (HOME_PORT_ID) REFERENCES PORTS (ID)
);

-- ALTER TABLE - "In Line" Constraints

ALTER TABLE PORTS MODIFY ID
  CONSTRAINT PORT_ID_PK PRIMARY KEY;

ALTER TABLE PORTS MODIFY NAME
  CONSTRAINT NAME_NN NOT NULL;

ALTER TABLE PORTS MODIFY NAME
  CONSTRAINT NAME_UQ UNIQUE;

ALTER TABLE SHIPS MODIFY HOME_PORT_ID
  CONSTRAINT SHIP_PORT_FK REFERENCES PORTS (ID);

-- ALTER TABLE - "Out of Line" Constraints

ALTER TABLE PORTS ADD CONSTRAINT
  PORT_ID_PK PRIMARY KEY (ID);

-- NOT NULL constraints can not be created "Out of Line"!

ALTER TABLE PORTS ADD CONSTRAINT
  NAME_UQ UNIQUE (NAME);

ALTER TABLE PORTS ADD
  CONSTRAINT PROPER_STATUS_CK
  CHECK (STATUS IN (4, 5));

ALTER TABLE SHIPS ADD CONSTRAINT SHIP_PORT_FK
  FOREIGN KEY (HOME_PORT_ID)
  REFERENCES PORTS (ID);

NOT NULL约束不能创建外线。