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.
Related
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);
create table a (
a_id integer,
a_name varchar2(10),
PRIMARY KEY (a_id)
)
create table b(
b_id,
b_name varchar2(10),
a_id integer,
PRIMARY KEY (a_id),
FOREIGN KEY (a_id) REFERENCES a(a_id)
)
If the children have FKs linking them to the parent, then you can use DELETE CASCADE on the parent.
CREATE TABLE book
( book_id int not null,
book_name varchar(50) not null,
CONSTRAINT book_pk PRIMARY KEY (book_id)
);
CREATE TABLE bookdetails
( detail_id int not null,
book_id int not null,
CONSTRAINT fk_book
FOREIGN KEY (book_id)
REFERENCES book(book_id)
ON DELETE CASCADE
);
Complete Procedure as you required just change the tables name in procedure
visit https://anzblog.com/2017/04/29/create-procedure-delete-child-table-data-parent-data-deleted/
It will work for you.As per my understanding.
I have 3 tables:
create table book (book_id int not null primary key,
book_name char (100) unique)
create table author (author_id int not null primary key,
authorname char (100) unique)
create table bookauthor (book_id int,
author_id int,
CONSTRAINT pk_book_id PRIMARY KEY (book_id,author_id))
I want to set
column book.book_id as fk to bookauthor.book_id
column author.author_id as fk to bookauthor.author_id
Please remember that pk in bookauthor is on book_id,author_id.
Change your bookauther table to
create table bookauther (
book_id int ,
auther_id int,
CONSTRAINT pk_book_id PRIMARY KEY (book_id,auther_id),
FOREIGN KEY (book_id) REFERENCES book(book_id),
FOREIGN KEY (auther_id) REFERENCES auther(auther_id)
)
Have a look at FOREIGN KEY Constraints and SQL FOREIGN KEY Constraint
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;
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