Oracle Sql Check Constraint!=其他表

时间:2017-07-01 16:19:57

标签: sql oracle constraints

我想在后者的主键和另一个表的主键之间的表上包含一个检查约束并插入!在两者之间,我该怎么办? 我一直受到这样的诱惑:

CREATE TABLE RESPONSABILE(
    ID_RESP             CHAR(10)        REFERENCES  UTENTE(ID_USER) PRIMARY KEY,
    CODICE_FISCALE      VARCHAR(16)     NOT NULL UNIQUE,
    NOME                VARCHAR(15)     NOT NULL,
    COGNOME             VARCHAR(15)     NOT NULL,
    CONSTRAINT  CK_FI   CHECK           (REGEXP_LIKE(CODICE_FISCALE,'^[A-Z]{6}[\d+]{2}[ABCDEHLMPRST]{1}[\d+]{2}([A-Z]{1}[\d+]{3})[A-Z]{1}$','I')),
    CONSTRAINT  CK_RE   CHECK           (ID_RESP != (ID_PR) REFERENCES PR(ID_PR) AND ID_RESP != (ID_CLIENTE) REFERENCES CLIENTE(ID_CLIENTE))
);

但我没有任何积极的结果

2 个答案:

答案 0 :(得分:0)

如果您的主键是从序列中获取的数字,那么完成您尝试执行的操作的最佳方法是从同一序列中获取两个表的ID号。如果你这样做,你可以保证他们不会互相复制,你就不需要一堆昂贵的逻辑来验证这种情况。

祝你好运。

答案 1 :(得分:0)

从语法错误检查约束的文本中可以看出,您希望强制执行多表检查约束。在Oracle(也许是任何RDBMS)中执行此操作的唯一方法是使用触发器。您不能在检查约束中引用多个表。

但是,根据您的Oracle版本,并根据the Oracle constraint documentation,您可能能够定义一个相当复杂的外键约束,因为这意味着:

  

您无法在包含AS子查询子句的CREATE TABLE语句中定义外键约束。相反,您必须创建没有约束的表,然后使用ALTER TABLE语句

添加它