【问题标题】:oracle change a column to uniqueoracle 将列更改为唯一的
【发布时间】:2013-10-04 10:58:49
【问题描述】:

系统已经这样创建了表

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)
);

新建的crete table语句如下:

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 中包含 UNIQUE。我如何改变桌子?我使用了以下语句,但它对我不起作用。

ALTER TABLE INSTANCES ADD CONSTRAINT ab UNIQUE ( INSTANCEID);

它给出了一个错误: 更改表实例添加约束 ab 唯一 (INSTANCEID) 错误报告: SQL 错误: ORA-02261: 此类唯一键或主键已存在于表中 02261. 00000 - “这样的唯一键或主键已经存在于表中” *原因:不言而喻。 *操作:删除多余的密钥。

请帮助我按照上面的要求更改表格。谢谢!

这里是SELECT con.constraint_name, col.column_name, con.constraint_type的输出 FROM user_cons_columns 列 加入 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"

【问题讨论】:

  • 奇怪。是否可以选择删除表并重新创建它?或者使用第二个 DDL 创建新表,然后用原始表中的数据填充它,然后删除第一个表并更改新表的名称以匹配原始表的名称?如果不能自己查看系统表,则不确定这里有什么问题。请添加结果:SELECT owner, constraint_name, constraint_type, table_name FROM all_constraints WHERE constraint_name = 'AB';
  • 你应该明确地命名你的约束。
  • @PrzemyslawKruglej 我会检查是否可以使用您重新创建表的选项。查询 SELECT owner, constraint_name, constraint_type, table_name FROM all_constraints WHERE constraint_name = 'AB';没有产生任何结果。
  • @DavidAldridge 请告诉我,如何明确命名约束?

标签: oracle oracle11g unique-constraint


【解决方案1】:

您已经声明 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 表的唯一约束和相关列。请检查 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);

不能创建非空约束。

【讨论】:

  • 表 INSTANCES 作为第一个创建语句创建:即 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) );
  • 这里我还没有将它设置为 INSTANCEID UNIQUE。它必须使用 ALTER 使其成为 UNIQUE。
  • 您的命令只列出了一行,即: CONSTRAINT_NAME COLUMN_NAME CONSTRAINT_TYPE ============================= ===== SYS_C0015550 INSTANCENAME U
  • 你能把同一个查询的结果加上 con.constraint_type = 'U' 条件吗?
  • 这是查询结果"CONSTRAINT_NAME","COLUMN_NAME","CONSTRAINT_TYPE" "SYS_C0015550","INSTANCENAME","U"导出的csv文件内容
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-04
  • 2023-01-10
  • 1970-01-01
相关资源
最近更新 更多