Let's say I have two tables: Entries and Entry_Locks.
Entries has 3 columns:
Entry_ID (Primary key),
Entry_Data,
Entry_Lock_ID (foreign key to Entry_Locks table - references Column Entry_Lock_ID).
Entry_Locks has 3 columns:
Entry_ID (foreign key to Entries table - references Column Entry_ID),
Entry_Lock_ID (primary key),
Timestamp.
Now I insert a row into Entry_Locks with an Entry_ID = 50 and Entry_Lock_ID = 25. I would like the row in Entries with Entry_ID = 50 to automatically have the column Entry_Lock_ID updated with the value 25, to reference the correct Entry_Lock_ID.
Right now my Entry_Locks schema looks like this:
entry_lock_id serial NOT NULL,
entry_id text NOT NULL,
"timestamp" date,
CONSTRAINT entry_lock_pkey PRIMARY KEY (entry_lock_id),
CONSTRAINT entry_entry_lock_fkey FOREIGN KEY (entry_id)
REFERENCES entries (entry_id) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE CASCADE
I was hoping that adding ON UPDATE CASCADE would achieve the desired effect, but the column in Entries is not getting updated as I would like. How can I achieve the desired behaviour?
Related
I Not able to add foreign key to tbl1 referencing tbl2 (Desc), here are the two tables :
please notice Tbl1 includes all values,tbl2 Has more values that doesn't necessarily exists in tbl1
Error(Msg 1776): There are no primary or candidate keys in the referenced table 'tbl2' that match the referencing column list in the foreign key 'fk_desc'.
tbl1:
alter table tbl1 add constraint pk_desc primary key (desc)
The Error:**alter table tbl1 add constraint fk_desc foreign key (desc)
references tbl2(desc)**
Desc
Astrogator
Geologist
Technician
tbl2:
alter table tbl2 add constraint pk_canid_desc primary
key(id,desc)
ID
Desc
1001
Astrogator
1001
Geologist
1001
Technician
2003
Biochemist
thank you for the help,
you cant make Desc that at table tbl2 as a FK while it contains values not exists at the table tbl1
Adding a foreign key is different depending on the flavor of SQL your using. For sql server you would bring up the parent db in SSMS using table design. Select Foreign key relationships and add a new relationship. From there select other table and column which has foreign key. Keep in mind that there needs to exist a foreign key for each Primary record or you will get an error.
I'm trying to come up with a solution for an exercise in which I have to create 3 tables: one for employees, one for projects, and one for projects and employees, in which I have to insert the employee's ID and associate with a project ID. In the project_employee table, since it has only 2 columns that reference other tables, I thought I could set them bot as foreign keys, like this:
CREATE TABLE employee_project
(
id_employee numeric FOREIGN KEY REFERENCES employee(id_employee),
id_project numeric FOREIGN KEY REFERENCES project(id_project)
)
Then I stumbled upon a problem: when inserting values on the 3 tables, I noticed that one of the employee's ID number was 4, but on the table employee there was no line with ID 4. Of course, this line wasn't created, but I want to understand: is there a way I could create a line whose ID has no matching record in the referenced table? Could it be a possible mistake in the question, or is there something I'm missing? Thanks in advance for your time!
If there is no rows in employee table with id_employee value 4 then there should not be rows in employee_project table with id_employee value 4. SQL Server will give you an error like below:
The INSERT statement conflicted with the FOREIGN KEY constraint "FK__employee__id__75F77EB0". The conflict occurred in database "test", table "dbo.employee", column 'id_employee'.
But if you want to create employee_project with composite primary key on both the column you can try this:
CREATE TABLE employee_project
(
id_employee int not null,
id_project int not null,
primary key(id_employee, id_project )
)
I have a table that I need to insert data into.
The table Sales has 4 columns
CustomerValueType_id (int)
Customer_id (int)
Value (NVARCHAR)
Customer_name (NVARCHAR)
The CustomerValueType_id, Customer_id are foreign keys that are not-unique, CustomerValueType_id matches to a value type, while Customer_id matches to the Customer_name.
I need to add additional customer data into the Valuecolumn but how do I ensure that the data matches to the correct CustomerValueType_id and Customer_id and each customer name has to be repeated in the Customer_name
Sales Table
You are trying to do denormalization.
Ideally, in the normalized design, you will just store, parent_ids in
the child table. If you want to see parent_name fields, you have to
get them based on JOIN conditions.
But, here as you are storing both id, name in the child table, I would suggest you to create composite Foreign key in the child table, so that the combination is always present. Also, make this combination as composite primary key in the parent table.
-- Parent Table PRIMARY KEY
ALTER TABLE dbo.CustomerValueType
ADD CONSTRAINT PK_CustomerValueType
PRIMARY KEY CLUSTERED (CustomerValueType_id, Value);
GO
--Child Table FOREIGN KEY
ALTER TABLE dbo.Sales
ADD CONSTRAINT FK_Sales_CustomerValueType
FOREIGN KEY (CustomerValueType_id,Value)
REFERENCES dbo.CustomerValueType(CustomerValueType_id,Value);
GO
I have a table:
ID Name ParentID
== ==== ========
1 A Null
2 B 1
3 C 2
so A is parent of B, and B is parent of C.
I need to create a constraint for column(ParentID) which does not accept a number is not exist in column (ID).
How I would do that?
You need to add Foreign Key.
ALTER TABLE table1
ADD CONSTRAINT fk_parent_id
FOREIGN KEY (parent_id) REFERENCES table1(id);
You can also create a foreign key using SSMS design as shown below. Expand table and right click on Keys - New Foreign key
Now click on the browse button of relationship and specify the colum nane of primary and foreign key table as shown below.
This is one of the way and you might select the preferred way either using query or design for creating the foreign key relationships between tables in Sql Server.
I have the following table "Pcategory", with the following 4 columns and PCategoryID is my primary key,
Pcategory Table
PCategoryID(PK) |TermID (FK)|SubCategoryID (FK)|CategoryID(FK)
PK -> Primary key
FK -> Foreign key
Please let me know how to write a SQL query to check the table has a unique combination of foriengn keys TermID (FK)|SubCategoryID (FK)|CategoryID (FK).
(i.e) I would be needing a list of duplicate records if any from the table with the combination of these 3 foriegn keys
Hope the below is what you are looking for :
select termid,subcategoryid,categoryid,count(1)
from pcategory
group by termid,subcategoryid,categoryid
having count(1) > 1