【发布时间】: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