Re: Question about modeling
Date: 25 Jan 2005 13:16:56 -0800
Message-ID: <1106687816.186483.228680_at_c13g2000cwb.googlegroups.com>
- Example Implementation Follows** SQL> _at_client_contracts SQL> SET ECHO On SQL> SQL> SQL> DROP TABLE department_contracts;
Table dropped.
SQL> DROP TABLE depts;
Table dropped.
SQL> DROP TABLE contracts;
Table dropped.
SQL> DROP TABLE clients;
Table dropped.
SQL> SQL> SQL> CREATE TABLE clients (client_id CHAR(2) PRIMARY KEY);
Table created.
SQL>
SQL> CREATE TABLE contracts
2 ( contract_id CHAR(2) PRIMARY KEY, 3 client_id CHAR(2) NOT NULL 4 REFERENCES clients (client_id), 5 CONSTRAINT uq_contractclient_contracts 6 UNIQUE (contract_id, client_id)7 );
Table created.
SQL>
SQL> CREATE TABLE depts
2 (
3 department_id CHAR(2) PRIMARY KEY, 4 client_id CHAR(2) NOT NULL 5 REFERENCES CLIENTS (client_id), 6 CONSTRAINT uq_deptsclients 7 UNIQUE (department_id, client_id)8 );
Table created.
SQL>
SQL> CREATE TABLE department_contracts
2 ( department_id CHAR(2), 3 contract_id CHAR(2), 4 client_id CHAR(2) NOT NULL, 5 CONSTRAINT pk_departmentcontracts 6 PRIMARY KEY (department_id, contract_id), 7 CONSTRAINT fk_departcontracts 8 FOREIGN KEY (department_id, client_id) 9 REFERENCES depts (department_id, client_id), 10 CONSTRAINT fk_contractclient 11 FOREIGN KEY (contract_id, client_id) 12 REFERENCES contracts (contract_id, client_id)13 );
Table created.
SQL> SQL> -- populate client table SQL> INSERT INTO clients (client_id)
2 VALUES ('C1'); 1 row created.
SQL>
SQL> INSERT INTO clients (client_id)
2 VALUES ('C2');
1 row created.
SQL>
SQL> INSERT INTO clients (client_id)
2 VALUES ('C3');
1 row created.
SQL> SQL> -- populate depts table SQL> INSERT INTO depts (department_id, client_id)2 VALUES ('D1', 'C1'); 1 row created.
SQL>
SQL> INSERT INTO depts (department_id, client_id)
2 VALUES ('D2', 'C2');
1 row created.
SQL>
SQL> INSERT INTO depts (department_id, client_id)
2 VALUES ('D3', 'C2');
1 row created.
SQL>
SQL> INSERT INTO depts (department_id, client_id)
2 VALUES ('D4', 'C3');
1 row created.
SQL>
SQL> INSERT INTO depts (department_id, client_id)
2 VALUES ('D5', 'C1');
1 row created.
SQL> SQL> -- populate contracts table SQL> INSERT INTO contracts (contract_id, client_id)2 VALUES ('CA', 'C1'); 1 row created.
SQL>
SQL> INSERT INTO contracts (contract_id, client_id)
2 VALUES ('CB', 'C1');
1 row created.
SQL>
SQL> INSERT INTO contracts (contract_id, client_id)
2 VALUES ('CC', 'C1');
1 row created.
SQL>
SQL> INSERT INTO contracts (contract_id, client_id)
2 VALUES ('CD', 'C2');
1 row created.
SQL>
SQL> INSERT INTO contracts (contract_id, client_id)
2 VALUES ('CE', 'C3');
1 row created.
SQL> SQL> -- show clients data SQL> SELECT *
2 FROM clients;
CL
-- C1 C2 C3 SQL> SQL> -- show depts data SQL> SELECT * 2 FROM depts; DE CL -- -- D1 C1 D2 C2 D3 C2 D4 C3 D5 C1 SQL> SQL> -- show contracts data SQL> SELECT * 2 FROM contracts; CO CL -- -- CA C1 CB C1 CC C1 CD C2 CE C3 SQL> SQL> -- populate department_contracts data SQL> -- D1 and CA belong to C1 client - good. SQL> INSERT INTO department_contracts (department_id, contract_id, client_id) 2 VALUES ('D1', 'CA', 'C1'); 1 row created. SQL> SQL> -- D1 and CB belong to C1 client - good SQL> INSERT INTO department_contracts (department_id, contract_id, client_id) 2 VALUES ('D1', 'CB', 'C1'); 1 row created. SQL> SQL> -- D1 and CC belong to C1 client - good SQL> INSERT INTO department_contracts (department_id, contract_id, client_id) 2 VALUES ('D1', 'CC', 'C1'); 1 row created. SQL> SQL> -- D1 and CC belongs to C1 client, but client does not match. SQL> INSERT INTO department_contracts (department_id, contract_id, client_id) 2 VALUES ('D1', 'CC', 'C2'); INSERT INTO department_contracts (department_id, contract_id, client_id)Received on Tue Jan 25 2005 - 22:16:56 CET
*
ERROR at line 1: ORA-00001: unique constraint (GUNTERMANND.PK_DEPARTMENTCONTRACTS) violated SQL> SQL> -- D1 belongs to C1 and CD belongs to C2. Does not work. SQL> INSERT INTO department_contracts (department_id, contract_id, client_id) 2 VALUES ('D1', 'CD', 'C1'); INSERT INTO department_contracts (department_id, contract_id, client_id)
*
ERROR at line 1: ORA-02291: integrity constraint (GUNTERMANND.FK_CONTRACTCLIENT) violated - parent key not found SQL> SQL> -- D1 belongs to C1 and CD belongs to C2. C3 does not work. SQL> INSERT INTO department_contracts (department_id, contract_id, client_id) 2 VALUES ('D1', 'CD', 'C3'); INSERT INTO department_contracts (department_id, contract_id, client_id)
*
ERROR at line 1: ORA-02291: integrity constraint (GUNTERMANND.FK_CONTRACTCLIENT) violated - parent key not found SQL> SQL> -- D2 belongs to C2, CD belongs to C2 -- good. SQL> INSERT INTO department_contracts (department_id, contract_id, client_id) 2 VALUES ('D2', 'CD', 'C2'); 1 row created. SQL> SQL> -- show depart_contracts data SQL> SELECT * 2 FROM department_contracts; DE CO CL -- -- -- D1 CA C1 D1 CB C1 D1 CC C1 D2 CD C2 SQL> SQL> spool off HTH, - Dan