1

これは私がやろうとしたことですが、うまくいきません:

ALTER TABLE DEPT
ADD CONSTRAINT DEPT_DNAME_CK CHECK (DNAME = 'ALF%');
4

2 に答える 2

1

dnameのような列にいくつかのエントリがある場合はalf%、制約を追加する前にエントリを削除する必要があります。

create table dept (dname varchar(250));
insert into dept select 'alflll' from dual;
alter table dept add constraint dept_dname_ck check (lower(dname) not like 'alf%');

エラーが発生します。

ORA-02293: cannot validate (*****.DEPT_DNAME_CK) - check constraint violated

エントリを削除します。

delete from dept where lower(dname) like 'alf%';
alter table dept add constraint dept_dname_ck check (lower(dname) not like 'alf%');

この制約を有効にした後、制約に違反しようとすると、エラーが発生します。

ORA-02290: チェック制約(****.DEPT_DNAME_CK)に違反しています

于 2015-07-20T06:55:29.593 に答える
0

単一の値を許可したいが、類似のものは許可したくない場合 (ここでの「類似」は、いずれにせよ最初の 3 文字が同じであるように見えます)、一意の関数ベースのインデックスを使用できます。

CREATE UNIQUE INDEX UNQ_DNAME_START ON DEPT (UPPER(SUBSTR(DNAME, 1, 3)));

Unique index UNQ_DNAME_START created.

次に、1 つの値を持つことができます。

INSERT INTO DEPT (DNAME) VALUES ('Alfred');

1 row inserted.

しかし、同様の値を 2 つ挿入しようとすると、エラーが発生します。

INSERT INTO DEPT (DNAME) VALUES ('alfonso');

Error report -
SQL Error: ORA-00001: unique constraint (SCHEMA.UNQ_DNAME_START) violated
00001. 00000 -  "unique constraint (%s.%s) violated"
*Cause:    An UPDATE or INSERT statement attempted to insert a duplicate key.
           For Trusted Oracle configured in DBMS MAC mode, you may see
           this message if a duplicate entry exists at a different level.
*Action:   Either remove the unique restriction or do not insert the key.

'alf%' を例として使用しただけで、実際には、その特定のプレフィックスではなく、すべての同様のエントリを防止したいと考えています。

于 2015-07-20T08:56:34.713 に答える