Sql 如何允许oracle表列在列中有多行,但值仅相同。使用约束

Sql 如何允许oracle表列在列中有多行,但值仅相同。使用约束,sql,oracle,constraints,Sql,Oracle,Constraints,如何允许oracle表列在列中有多行,但仅具有相同的值 Create Table test ( col int); case - I insert into test values (1); --should work insert into test values (1); --should work insert into test values (2); --Should throw error !!!! cas

如何允许oracle表列在列中有多行,但仅具有相同的值

    Create Table test ( col int);


    case - I
    insert into test values (1);
    --should work
    insert into test values (1);
    --should work
    insert into test values (2);
    --Should throw error !!!!

    case - II
    truncate table test;
    insert into test values (2);
    --should work
    insert into test values (2);
    --Should work
    insert into test values (1);
    --Should throw error !!!!!!

更新

根据OP的两个案例,我认为插入触发器之前的可以完成以下任务:

测试用例:

SQL> DROP TABLE TEST PURGE;

Table dropped.

SQL>
SQL> CREATE TABLE test
  2    ( col INT
  3    );

Table created.

SQL>
SQL> CREATE OR REPLACE TRIGGER trg BEFORE
  2    INSERT ON TEST FOR EACH ROW DECLARE ID NUMBER;
  3    BEGIN
  4      BEGIN
  5        SELECT DISTINCT col INTO ID FROM TEST;
  6      EXCEPTION
  7      WHEN no_data_found THEN
  8        NULL;
  9      END;
 10      IF :NEW.col <> id THEN
 11        RAISE_APPLICATION_ERROR(-20001, 'Cannot Insert different value in the table');
 12      END IF;
 13    END;
 14  /

Trigger created.

SQL>
案例2

SQL> TRUNCATE TABLE TEST;

Table truncated.

SQL>
SQL> INSERT INTO TEST VALUES (2);

1 row created.

SQL>
SQL> INSERT INTO TEST VALUES (2);

1 row created.

SQL>
SQL> INSERT INTO TEST VALUES (1);
INSERT INTO TEST VALUES (1)
            *
ERROR at line 1:
ORA-20001: Cannot Insert different value in the table
ORA-06512: at "LALIT.TRG", line 10
ORA-04088: error during execution of trigger 'LALIT.TRG'


SQL>

如果我正确理解了您的要求,您可以在插入触发器之前使用。检查表中的值,如果新值与表值匹配或表中没有数据,则只允许插入

这是关于触发器的链接

您可以对此使用检查约束。。我不认为有限制就可以做到。我以前从未见过需要这种解决方案的问题-你确定你已经正确地建模了吗?我认为插入前触发器可以完成这项工作。我已经更新了我的答案。嘿,Lalit,这违反了案例二。@touchchandra,请看我答案中的更新。我想这就是你需要的。它处理了这两种情况。
SQL> TRUNCATE TABLE TEST;

Table truncated.

SQL>
SQL> INSERT INTO TEST VALUES (2);

1 row created.

SQL>
SQL> INSERT INTO TEST VALUES (2);

1 row created.

SQL>
SQL> INSERT INTO TEST VALUES (1);
INSERT INTO TEST VALUES (1)
            *
ERROR at line 1:
ORA-20001: Cannot Insert different value in the table
ORA-06512: at "LALIT.TRG", line 10
ORA-04088: error during execution of trigger 'LALIT.TRG'


SQL>