1

テーブルはこの方法でシステムに作成されました

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 ステートメントは次のとおりです。

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

エラーが発生しました: ALTER TABLE INSTANCES ADD CONSTRAINT 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"
4

1 に答える 1

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 テーブルの 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 制約は作成できません。

于 2013-10-04T11:20:56.320 に答える