I have a table called patient_address
, which reference a PK key in patient
table. But if I try to run one of the following statements :
update patient set id_no='7008255601088' where id_no='8008255601089'
update patient_address set id_no='7008255601088' where id_no='8008255601089'
I get this error message:
«The UPDATE statement conflicted with the REFERENCE constraint
«FK__patient_a__id_no__27C3E46E». The conflict occurred in database
«PMS», table «dbo.patient_address», column ‘id_no’.» or «The
UPDATE statement conflicted with the FOREIGN KEY constraint
«FK__patient_a__id_no__27C3E46E». The conflict occurred in database
«PMS», table «dbo.patient», column ‘id_no’.» .
Does any body know the possible cause ? Thanks.
MackM
2,8665 gold badges32 silver badges45 bronze badges
asked May 25, 2014 at 14:39
chosenOne ThabschosenOne Thabs
1,4443 gold badges21 silver badges38 bronze badges
5
This error is encountered when the primary key of a table is updated but it is referenced by a foreign key from another table and the update specific is set to No action. The No action is the default option.
If this is your case and No action is set on the update operation you can change the foreign-key definition to Cascade.
Right click your foreign key and select Modify. In the Foreign key relationships dialog under the INSERT and UPDATE specifics set the UPDATE rule on Cascade:
You can also set the rule using T-SQL:
ALTER TABLE YourTable
DROP Constraint Your_FK
GO
ALTER TABLE YourTable
ADD CONSTRAINT [New_FK_Constraint]
FOREIGN KEY (YourColumn) REFERENCES ReferencedTable(YourColumn)
ON DELETE CASCADE ON UPDATE CASCADE
GO
Hope this helps
answered May 25, 2014 at 15:14
5
If you don’t want to change your table structure, you can run the following query:
ALTER TABLE [UserStore]
NOCHECK CONSTRAINT FK_UserStore_User_UserId
ALTER TABLE [UserIdentity]
NOCHECK CONSTRAINT FK_UserIdentity_User_UserId
BEGIN TRAN
UPDATE [user]
SET Id = 10
WHERE Id = 9
UPDATE [dbo].[UserStore]
SET UserId = 10
WHERE UserId = 9
UPDATE [dbo].UserIdentity
SET UserId = 10
WHERE UserId = 9
COMMIT TRAN
ALTER TABLE [UserStore]
CHECK CONSTRAINT FK_UserStore_User_UserId
ALTER TABLE UserIdentity
CHECK CONSTRAINT FK_UserIdentity_User_UserId
answered Jul 11, 2019 at 21:12
Bartho BernsmannBartho Bernsmann
2,4031 gold badge25 silver badges33 bronze badges
It sometimes happens when you try to Insert/Update
an entity while the foreign key
that you are trying to Insert/Update
actually does not exist. So, be sure that the foreign key
exists and try again.
answered Feb 6, 2019 at 10:06
In MySQL
set foreign_key_checks=0;
UPDATE patient INNER JOIN patient_address
ON patient.id_no=patient_address.id_no
SET patient.id_no='8008255601088',
patient_address.id_no=patient.id_no
WHERE patient.id_no='7008255601088';
Note that foreign_key_checks only temporarily set foreign key checking false. So it need to execute every time before update statement. We set it 0 as if we update parent first then that will not be allowed as child may have already that value. And if we update child first then that will also be not allowed as parent may not have that value from which we are updating. So we need to set foreign key check.
Another thing is that if you are using command line tool to use this query then put care to mention spaces in place where i put new line or ENTER in code. As command line take it in one line, so it may happen that two words stick as patient_addressON which create syntax error.
answered Aug 6, 2016 at 3:41
This was the solution for me:
-- Check how it is now
select * from patient
select * from patient_address
-- Alter your DB
alter table patient_address nocheck constraint FK__patient_a__id_no__27C3E46E
update patient
set id_no='7008255601088'
where id_no='8008255601088'
alter table patient_address nocheck constraint FK__patient_a__id_no__27C3E46E
update patient_address
set id_no='7008255601088'
where id_no='8008255601088'
-- Check how it is now
select * from patient
select * from patient_address
answered Nov 8, 2018 at 23:28
Reason is as @MilicaMedic says. Alternative solution is disable all constraints, do the update and then enable the constraints again like this. Very useful when updating test data in test environments.
exec sp_MSforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"
update patient set id_no='7008255601088' where id_no='8008255601088'
update patient_address set id_no='7008255601088' where id_no='8008255601088'
exec sp_MSforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"
Source:
https://stackoverflow.com/a/161410/3850405
answered Apr 3, 2019 at 10:37
OgglasOgglas
59.5k36 gold badges322 silver badges405 bronze badges
I would not change the constraints,
instead, you can insert a new record in the table_1 with the primary key (id_no = 7008255601088). This is nothing but a duplicate row of the id_no = 8008255601088. so now patient_address with the foreign key constraint (id_no = 8008255601088) can be updated to point to the record with the new ID(ID which needed to be updated), which is updating the id_no to id_no =7008255601088.
Then you can remove the initial primary key row with id_no =7008255601088.
Three steps include:
- Insert duplicate row for new id_no
- Update Patient_address to point to new duplicate row
- Remove the row with old id_no
answered Jan 15, 2016 at 18:14
Charan RajCharan Raj
4715 silver badges8 bronze badges
I guess if you change the id_no
, some of the foreign keys would not reference anything, thus the constraint violation.
You could add initialy deffered
to the foreign keys, so the constraints are checked when the changes are commited
jezzah
911 silver badge9 bronze badges
answered May 25, 2014 at 14:45
wastlwastl
2,64313 silver badges27 bronze badges
3
44 / 41 / 35 Регистрация: 27.02.2013 Сообщений: 284 |
|
1 |
|
08.12.2014, 18:19. Показов 3080. Ответов 13
Помогите новичку разобраться со следующим примером. У меня есть связанные между собой внеш ключами табл1, табл2, табл3. Если я обновляю запись в табл1, нужно, чтобы в табл2 и табл3 тоже происходили изменения. Но когда я в запросе использую инструкцию UPDATE, программа выдает ошибку The UPDATE statement conflicted with the REFERENCE constraint «fk7». The conflict occurred in database «project»…
0 |
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
08.12.2014, 18:19 |
13 |
1312 / 944 / 144 Регистрация: 17.01.2013 Сообщений: 2,348 |
|
09.12.2014, 07:24 |
2 |
Это вы добиваетесь, чтобы первичный ключ в справочнике был без разрывов в нумерации? Удачи…
0 |
44 / 41 / 35 Регистрация: 27.02.2013 Сообщений: 284 |
|
09.12.2014, 09:36 [ТС] |
3 |
Это вы добиваетесь, чтобы первичный ключ в справочнике был без разрывов в нумерации нет. мне просто нужно изменить запись одновременно в нескольких таблицах. Неужели никто не может объяснить как или объяснить что это невозможно.
0 |
1448 / 1120 / 345 Регистрация: 11.04.2011 Сообщений: 2,616 |
|
09.12.2014, 10:15 |
4 |
нет. мне просто нужно изменить запись одновременно в нескольких таблицах. Вам ничто не мешает просто изменить записи в нескольких таблицах, но если вы видите ошибку «The UPDATE statement conflicted with the REFERENCE constraint «fk7». The conflict occurred in database «project»…», то это означает, что вы хотите не просто изменить запись, вы хотите изменить первичный ключ, на который ссылаются внешние ключи из других таблиц. Как правила, подобная операция не имеет смысла, но если сильно хочется, то можно создавать внешний ключ с аргументом ON UPDATE CASCADE.
0 |
44 / 41 / 35 Регистрация: 27.02.2013 Сообщений: 284 |
|
09.12.2014, 10:36 [ТС] |
5 |
создавать внешний ключ с аргументом ON UPDATE CASCADE. он у меня и создан таким образом
0 |
1312 / 944 / 144 Регистрация: 17.01.2013 Сообщений: 2,348 |
|
09.12.2014, 12:53 |
6 |
программа выдает ошибку The UPDATE statement conflicted with the REFERENCE constraint «fk7». The conflict occurred in database «project»… Это срабатывает механизм защиты ссылочной целостности базы, и означает это (обычно), что в справочнике нет записи с указанным вами кодом.
0 |
44 / 41 / 35 Регистрация: 27.02.2013 Сообщений: 284 |
|
09.12.2014, 14:06 [ТС] |
7 |
Это срабатывает механизм защиты ссылочной целостности базы, и означает это (обычно), что в справочнике нет записи с указанным вами кодом. так что мне теперь делать, удалить внешние ключи? просто вам людям знающим многие вещи очевидны. а я так и не поняла как мне решить мою задачу
0 |
1448 / 1120 / 345 Регистрация: 11.04.2011 Сообщений: 2,616 |
|
09.12.2014, 14:17 |
8 |
так что мне теперь делать не выполнять действия, нарушающие ссылочную целостность. Не нужно изменять значение из первичного ключа, если на него ссылаются внешние ключи. Не нужно внешнему ключу устанавливать значение, которое на момент выполнения команды отсутствует в родительской таблице. В каком месте вы нарушили ссылочную целостность, не ясно, так как вы не привели ни структуру таблиц ни выполняемый код.
0 |
Lar4ik 44 / 41 / 35 Регистрация: 27.02.2013 Сообщений: 284 |
||||
09.12.2014, 15:31 [ТС] |
9 |
|||
Миниатюры
0 |
1448 / 1120 / 345 Регистрация: 11.04.2011 Сообщений: 2,616 |
|
09.12.2014, 16:01 |
10 |
Lar4ik, у вас 2 внешних ключа ссылаются на изменяемое поле номер_катера. Оба ли ключа созданы с аргументом ON UPDATE CASCADE?
1 |
Lar4ik 44 / 41 / 35 Регистрация: 27.02.2013 Сообщений: 284 |
||||||||
09.12.2014, 16:13 [ТС] |
11 |
|||||||
Оба ли ключа созданы с аргументом ON UPDATE CASCADE? да, оба
0 |
1448 / 1120 / 345 Регистрация: 11.04.2011 Сообщений: 2,616 |
|
09.12.2014, 16:43 |
12 |
Lar4ik, А почему у меня на почте вместо ON UPDATE CASCADE везде стоит ON DELETE CASCADE? Ответ, конечно, очевиден — редактирование сообщений не запрещено. Но от того, что вы изменили сообщение на форуме, ситуация в вашей БД не изменилась.
0 |
44 / 41 / 35 Регистрация: 27.02.2013 Сообщений: 284 |
|
09.12.2014, 16:54 [ТС] |
13 |
я еще раз пересоздала таблицы. все заработало. Добавлено через 9 минут
0 |
1448 / 1120 / 345 Регистрация: 11.04.2011 Сообщений: 2,616 |
|
09.12.2014, 17:00 |
14 |
Lar4ik, чтобы каскадом все обновлялось и удалялось нужно писать ON DELETE CASCADE ON UPDATE CASCADE
1 |
During an UPDATE statement on a particular row on a SQL Server table , this error message appeared:
Error Message:The UPDATE statement conflicted with the REFERENCE constraint «FK_My_Constraint». The conflict occured in database «MyDB»,table «dbo.MyTable». The statement has been terminated
The initial input value was incorrect , so I needed to update the value — but there was a foreign key constraint in place to retain integrity between the tables. The way to fix this issue is to temporarily disable the FOREIGN KEY constraint — change the values and the set the FOREIGN KEY constraint again.
SQL Server has a built-in facility via the ALTER TABLE command to disable — enable FOREIGN KEY constraints
This sequence of sql statements will disable and then re enable the FOREIGN KEY constraint — using the NOCHECK and CHECK CHECK switches with ALTER TABLE commands
-- Disable single FOREIGN KEY constraint ALTER TABLE MyTable NOCHECK CONSTRAINT MyConstraint -- Enable single FOREIGN KEY constraint ALTER TABLE MyTable WITH CHECK CHECK CONSTRAINT MyConstraint
These type of errors can also occur in a DELETE statement — if there is a FOREIGN KEY constraint — for more information conflicts during a DELETE statement — read The DELETE statement conflicted with the REFERENCE constraint
Some helpful links to managing FOREIGN KEYS
How to list constraints of a table
List Foreign Key Constraints -MS SQL <===Old School method
How to drop a SQL column and find foreign keys with sp_fkeys
Author: Tom Collins (http://www.sqlserver-dba.com)
Share:
Hi guys I have to update a foreign key, on a server sql 2014, but when I run the code below I have the following error, how can fix it?
Error:
Msg 3621, Level 0, State 0.
The statement has been terminated.
Msg 547, Level 16, State 0.
The UPDATE statement conflicted with the FOREIGN KEY constraint «fk_restirizione_idrapportomobile». The conflict occurred in database «db», table «dbo.RapportoMobile», column ‘IdRapportoMobile’. (Line 1)
SQL Code:
UPDATE risorsarapportomobile
SET risorsarapportomobile.idrapportomobile = 1236
WHERE risorsarapportomobile.idrisorseumane IN (SELECT
risorseumane.idrisorseumane
FROM risorsarapportomobile
INNER JOIN risorseumane
ON
risorseumane.idrisorseumane =
risorsarapportomobile.idrisorseumane
WHERE risorsarapportomobile.idrapportomobile IS NULL
AND CONVERT(VARCHAR(10), '26-06-2018', 105) =
CONVERT(VARCHAR(10), risorseumane.data, 105)
AND risorseumane.idcantiere = 158)
Tables:
- Remove From My Forums
-
Question
-
Hello team,
I have two tables one is Temp, the structure of both is shape of EmployeeID and ManagerID with a FK relation on the same table, the temp table does not have this FK at all.
I have two problems:
1) I’m almost sure that every EmployeeID has a ManagerID except for the most parent has a Null parent, so the relation is fine; I need to make sure that this is the case with a sql statement ( I have created some, but need a verification from experts like you)
2) When I update the orginal table with the temp table I get the error «The UPDATE statement conflicted with the FOREIGN KEY SAME TABLE constraint«
I’m using ADO to execute this update in a transaction using a stored procedure (SQL server 2005) …I need to put my hand on the problem.
Is there something like NOCHECK can handle this situatin?
Your quick response is very much appreciated.
TheScorpion