Конфликт инструкции update с ограничением reference

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's user avatar

MackM

2,8665 gold badges32 silver badges45 bronze badges

asked May 25, 2014 at 14:39

chosenOne Thabs's user avatar

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:

enter image description here

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

Milica Medic Kiralj's user avatar

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 Bernsmann's user avatar

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

Masoud Darvishian's user avatar

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

YATIN GUPTA's user avatar

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

Francesco Mantovani's user avatar

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

Ogglas's user avatar

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:

  1. Insert duplicate row for new id_no
  2. Update Patient_address to point to new duplicate row
  3. Remove the row with old id_no

answered Jan 15, 2016 at 18:14

Charan Raj's user avatar

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's user avatar

jezzah

911 silver badge9 bronze badges

answered May 25, 2014 at 14:45

wastl's user avatar

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

Цитата
Сообщение от cygapb-007
Посмотреть сообщение

Это вы добиваетесь, чтобы первичный ключ в справочнике был без разрывов в нумерации

нет. мне просто нужно изменить запись одновременно в нескольких таблицах. Неужели никто не может объяснить как или объяснить что это невозможно.



0



1448 / 1120 / 345

Регистрация: 11.04.2011

Сообщений: 2,616

09.12.2014, 10:15

4

Цитата
Сообщение от Lar4ik
Посмотреть сообщение

нет. мне просто нужно изменить запись одновременно в нескольких таблицах.

Вам ничто не мешает просто изменить записи в нескольких таблицах, но если вы видите ошибку «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

Цитата
Сообщение от kodv
Посмотреть сообщение

создавать внешний ключ с аргументом ON UPDATE CASCADE.

он у меня и создан таким образом



0



1312 / 944 / 144

Регистрация: 17.01.2013

Сообщений: 2,348

09.12.2014, 12:53

6

Цитата
Сообщение от Lar4ik
Посмотреть сообщение

программа выдает ошибку 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

Цитата
Сообщение от cygapb-007
Посмотреть сообщение

Это срабатывает механизм защиты ссылочной целостности базы, и означает это (обычно), что в справочнике нет записи с указанным вами кодом.

так что мне теперь делать, удалить внешние ключи? просто вам людям знающим многие вещи очевидны. а я так и не поняла как мне решить мою задачу



0



1448 / 1120 / 345

Регистрация: 11.04.2011

Сообщений: 2,616

09.12.2014, 14:17

8

Цитата
Сообщение от Lar4ik

так что мне теперь делать

не выполнять действия, нарушающие ссылочную целостность. Не нужно изменять значение из первичного ключа, если на него ссылаются внешние ключи. Не нужно внешнему ключу устанавливать значение, которое на момент выполнения команды отсутствует в родительской таблице. В каком месте вы нарушили ссылочную целостность, не ясно, так как вы не привели ни структуру таблиц ни выполняемый код.



0



Lar4ik

44 / 41 / 35

Регистрация: 27.02.2013

Сообщений: 284

09.12.2014, 15:31

 [ТС]

9

SQL
1
2
3
4
USE project;
UPDATE Паспорт
    SET Номер_катера=456
        WHERE Номер_катера=123;

Миниатюры

Инструкция UPDATE
 



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

Цитата
Сообщение от kodv
Посмотреть сообщение

Оба ли ключа созданы с аргументом ON UPDATE CASCADE?

да, оба

SQL
1
2
3
4
5
6
7
8
9
10
USE project;
CREATE TABLE Рейсы (Номер_рейса INT IDENTITY (1,1),
                    Номер_катера INTEGER NOT NULL,
                    Дата_выхода DATE NOT NULL,
                    Время_выхода TIME NOT NULL,
                    Дата_возвращения DATE NOT NULL,
                    Время_возвращения TIME NOT NULL,
            CONSTRAINT pk2_id PRIMARY KEY (Номер_рейса),
            CONSTRAINT fk6 FOREIGN KEY (Номер_катера) REFERENCES Паспорт ON UPDATE CASCADE
            );
SQL
1
2
3
4
5
6
7
8
9
10
USE project;
CREATE TABLE Команда (ID INT IDENTITY (1,1),
                        Имя_рыбака CHAR (20) NOT NULL,
                        Номер_должности INT NOT NULL,
                        Адрес CHAR (30) NOT NULL,
                        Номер_катера INT NOT NULL,
                CONSTRAINT pk3_id PRIMARY KEY (ID),
                CONSTRAINT fk7 FOREIGN KEY (Номер_катера) REFERENCES Паспорт ON UPDATE CASCADE,
                CONSTRAINT fk8 FOREIGN KEY (Номер_должности) REFERENCES Должность 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 минут
kodv, а если мне понадобится удалять записи, тоже работать не будет, так как указано UPDATE?



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:

enter image description here

enter image description here

  • 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

Понравилась статья? Поделить с друзьями:
  • Кетонал таблетки инструкция по применению цена фото
  • Руководство театра ленсовета
  • Должностная инструкция инженера по защите информации в школе
  • Ветаптечка для цыплят на 50 голов инструкция по применению
  • Мануал yamaha vmax 1200