SQL foreign key of foreign key - sql

First of all I´m working with DB2.
My problem:
I have a table A with a primary key.
A table B with 2 primary keys (one of them is a foreign key of A)
A table C with a primary key
A table D which has got the primary keys of B and C
How can I create table D?
My first idea was that, but it doesn't work:
Create Table D(
A varchar(20) not null references B(A),
B varchar(20) not null references B(name of prim key attribute from B),
C varchar(20) not null references C,
primary key(A,B,C)
);
Hope you understand my problem and can help me.

Foreign keys reference the names of columns, not the names of constraints.
The set up . . .
create table A (
col_a int primary key
);
create table B (
col_a int not null,
col_b int not null,
primary key (col_a, col_b),
foreign key (col_a) references A (col_a)
);
create table C (
col_c int primary key
);
And the execution . . .
create table D (
col_a int not null,
col_b int not null,
col_c int not null,
primary key (col_a, col_b, col_c),
foreign key (col_a, col_b) references B (col_a, col_b),
foreign key (col_c) references C (col_c)
);

As Marc_s commented there can only be ONE primary key in a table ie, you cannot have more than one primary key in a table.
As a solution to your problem you can probably combine two columns of table B and table C which can together act as a primary key for table D

Related

sqlite insert into table with NULL foreign key

I have the following tables: (notice that SUPP may be NULL)
CREATE TABLE IF NOT EXISTS A
(
ID INTEGER PRIMARY KEY NOT NULL
);
CREATE TABLE IF NOT EXISTS B
(
ID INTEGER PRIMARY KEY NOT NULL
);
CREATE TABLE IF NOT EXISTS C
(
ID INTEGER PRIMARY KEY NOT NULL
);
CREATE TABLE IF NOT EXISTS D
(
SID INTEGER NOT NULL,
DID INTEGER NOT NULL,
SUPP INTEGER,
PRIMARY KEY (SID, DID),
FOREIGN KEY (SID) REFERENCES A (ID),
FOREIGN KEY (DID) REFERENCES B (ID),
FOREIGN KEY (SUPP) REFERENCES C (ID)
);
Assuming table A contains ID=2 and table B contains ID=5.
I want to perform the following insert:
INSERT OR REPLACE INTO D VALUES (2,5,NULL);
However I get the following error:
Foreign key mismatch - D referencing C (INSERT INTO "main"."D" ...
I'm assuming the issue stems from the NULL foreign key but I don't know what I did wrong or how to fix it.
You need to use valid referenced value if you are inserting into child table. The ID 2 in table A and ID 5 in table B has to be present.
CREATE TABLE IF NOT EXISTS A
(
ID INTEGER PRIMARY KEY NOT NULL
);
CREATE TABLE IF NOT EXISTS B
(
ID INTEGER PRIMARY KEY NOT NULL
);
CREATE TABLE IF NOT EXISTS C
(
ID INTEGER PRIMARY KEY NOT NULL
);
CREATE TABLE IF NOT EXISTS D
(
SID INTEGER NOT NULL,
DID INTEGER NOT NULL,
SUPP INTEGER,
PRIMARY KEY (SID, DID),
FOREIGN KEY (SID) REFERENCES A (ID),
FOREIGN KEY (DID) REFERENCES B (ID),
FOREIGN KEY (SUPP) REFERENCES C (ID)
);
INSERT INTO A VALUES (2);
INSERT INTO B VALUES (5);
INSERT INTO D VALUES (2, 5, NULL);

PostgreSQL foreign key with inheritance

I have a PostgreSQL database, 3 tables and my schema as follows.
CREATE TABLE table_a (
id SERIAL PRIMARY KEY,
name_a VARCHAR(255)
);
CREATE TABLE table_b (
name_b VARCHAR(255)
) INHERITS (table_a);
CREATE TABLE table_c (
name_c VARCHAR(255)
) INHERITS (table_a);
insert into table_b (name_a, name_b) values('table A','table B1');
insert into table_b (name_a, name_b) values('table A','table B2');
insert into table_c (name_a, name_c) values('table A','table C1');
insert into table_c (name_a, name_c) values('table A','table C2');
select * from table_a;
select * from table_b;
select * from table_c;
Now i want to add an association between Table Band Table C like this:
I do not know if this is possible when we inherit the same table ?
I do not see how I can create this association ?
You need a unique identifier or primary key on table_b. Quoting docs:
All check constraints and not-null constraints on a parent table are automatically inherited by its children, unless explicitly specified otherwise with NO INHERIT clauses. Other types of constraints (unique, primary key, and foreign key constraints) are not inherited.
CREATE TABLE table_a (
id SERIAL PRIMARY KEY,
name_a VARCHAR(255)
);
CREATE TABLE table_b (
name_b VARCHAR(255),
primary key (id) --> here you set the PK
) INHERITS (table_a);
CREATE TABLE table_c (
name_c VARCHAR(255),
id_b int references table_b(id) --> the fk to b through pk
) INHERITS (table_a);
Alternative way
In your second diagram, do you have a kind of identifier for table_b. It is right because you can reference table by a unique field. In this case, the DDL will be like this:
CREATE TABLE table_a (
id SERIAL PRIMARY KEY,
name_a VARCHAR(255)
);
CREATE TABLE table_b (
name_b VARCHAR(255),
id_b SERIAL UNIQUE --> Here the unique id for b
--, primary key (id) -- optionally
) INHERITS (table_a);
CREATE TABLE table_c (
name_c VARCHAR(255),
id_b int references table_b(id_b) --> the fk to b through unique
) INHERITS (table_a);
I prefer the first approach, but I have posted also this one just for academical purposes.

Oracle SQL Constraints same value in other tables

I need a short answers how to make constraints when
I have table A, B, C, E
Table E have E_ID (E id is primary key)
Table B have B_ID, E_ID (E id are foreign keys)
Table C have C_ID, E_ID (E id are foreign key)
Table A have A_ID,B_ID,C_ID (B and C id are foreign keys)
where id are primary keys.
I want constrain to make sure I table A i have records where C_ID and B_ID has same E_ID.
And it should still have 3rd normal form.
You need the following four constraints:
alter table a add constraint fk1 foreign key (b_id) references b (b_id);
alter table a add constraint fk2 foreign key (c_id) references c (c_id);
alter table c add constraint fk3 foreign key (e_id) references e (e_id);
alter table b add constraint fk4 foreign key (e_id) references e (e_id);
One method is to repeat e_id in table a and then use this for foreign key constraints.
Note the foreign key relationships to the unique keys in this data model:
create table e (eid int primary key);
create table b (bid int primary key,
eid int references e(eid),
unique (bid, eid)
);
create table c (cid int primary key,
eid int references e(eid),
unique (cid, eid)
);
create table a (aid int primary key,
bid int references b(bid),
cid int references c(cid),
eid int references e(eid),
foreign key (bid, eid) references b(bid, eid),
foreign key (cid, eid) references c(cid, eid)
);
Here is a SQL Fiddle.

Reference from one table to another entire table and specified row

I've got three tables: A, B and C. I want to create table A, and it should have 3 columns, first one should be a PRIMARY KEY.
1) How to create second column, with is a refference to table B,
2) and third with is a refference to 'C.id' row from table C. A.id = C.id
CREATE TABLE A
(
id SERIAL PRIMARY KEY,
// ? - reference to table B
// ? - reference to C.id row. A.id = C.id
)
Database: postgresql
I assume you use mysql database.
CREATE TABLE A
(
id INT NOT NULL PRIMARY KEY,
b_id INT NOT NULL,
c_id INT NOT NULL,
FOREIGN KEY (b_id) REFERENCES B (id),
FOREIGN KEY (c_id) REFERENCES C (id)
) TYPE = INNODB;
Update for using postgresql:
CREATE TABLE "A"
(
id integer NOT NULL,
b_id integer NOT NULL,
c_id integer NOT NULL,
CONSTRAINT id PRIMARY KEY (id),
CONSTRAINT b_id FOREIGN KEY (b_id) REFERENCES "B" (id)
ON UPDATE NO ACTION ON DELETE NO ACTION, --with no action restriction
CONSTRAINT c_id FOREIGN KEY (c_id) REFERENCES "C" (id)
ON UPDATE CASCADE ON DELETE CASCADE --with cascade restriction
)
WITH (
OIDS = FALSE
)
;
ALTER TABLE "C" OWNER TO postgres;

Business-Logic Relationships in SQL

Can anyone please tell me how can one estabilish 1 to 0..1 and 1 to 1..* relationships between tables in SQL (Server)?
Thank you very much.
1 to 1..*
Create a Foreign key from a parent table to the primary key of the child (lookup table).
CREATE TABLE A
(
id int NOT NULL IDENTITY(1,1) PRIMARY KEY,
Somecolumn int,
SomeOtherColumn Varchar(50),
B_id int CONSTRAINT FOREIGN KEY REFERENCES B(id),
-- ...other columns
)
CREATE TABLE B
(
id int NOT NULL IDENTITY(1,1) PRIMARY KEY,
Name Varchar(50)
)
1 to 0..1
Create a table with the primary key also defined as a Foreign key to the parent table
CREATE TABLE [Master]
(
id int NOT NULL IDENTITY(1,1) PRIMARY KEY,
Somecolumn int,
SomeOtherColumn Varchar(50),
-- ...other columns
)
CREATE TABLE [Child]
(
id int NOT NULL PRIMARY KEY,
OtherColumn Varchar(50),
)
ALTER TABLE Child
ADD CONSTRAINT FK_Master FOREIGN KEY (id) REFERENCES Master(id)
One to many
Define two tables (example A and B), with their own primary key
Define a column in Table A as having a Foreign key relationship based on the primary key of Table B
This means that Table A can have one or more records relating to a single record in Table B.
If you already have the tables in place, use the ALTER TABLE statement to create the foreign key constraint:
ALTER TABLE A ADD CONSTRAINT FOREIGN KEY fk_b ( b_id ) references b(id)
* fk_b: Name of the foreign key constraint, must be unique to the database
* b_id: Name of column in Table A you are creating the foreign key relationship on
* b: Name of table, in this case b
* id: Name of column in Table B