Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Конфликт инструкции DELETE с ограничением REFERENCE  [new]
Михайло_
Member

Откуда:
Сообщений: 118
Запросом на удаление удаляю записи из таблицы, имеющей связи с другими таблицами. Получаю сообщение:

Конфликт инструкции DELETE с ограничением REFERENCE
Выполнение данной инструкции было прервано.

Какую нужно предварительно выполнить команду, которая позволила бы MS SQL Server удалить все записи без связей и оставить записи со связями? Типа:

set ... ON;
DELETE ...
set ... OFF;
25 фев 16, 10:42    [18860867]     Ответить | Цитировать Сообщить модератору
 Re: Конфликт инструкции DELETE с ограничением REFERENCE  [new]
Glory
Member

Откуда:
Сообщений: 104760
Михайло_
Какую нужно предварительно выполнить команду, которая позволила бы MS SQL Server удалить все записи без связей и оставить записи со связями?

Нужно удалить зависимые записи из дочерней таблицы.
При отсутствии зависимых записей такое сообщение не выдается.
25 фев 16, 10:43    [18860884]     Ответить | Цитировать Сообщить модератору
 Re: Конфликт инструкции DELETE с ограничением REFERENCE  [new]
Михайло_
Member

Откуда:
Сообщений: 118
Не подходит.
Существует ли команда серверу "пропустить неудаляемые записи" или "не останавливаться на ошибках"?
25 фев 16, 10:51    [18860921]     Ответить | Цитировать Сообщить модератору
 Re: Конфликт инструкции DELETE с ограничением REFERENCE  [new]
londinium
Member

Откуда: Киев
Сообщений: 1193
Удаляйте в курсоре
25 фев 16, 10:54    [18860933]     Ответить | Цитировать Сообщить модератору
 Re: Конфликт инструкции DELETE с ограничением REFERENCE  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
IF OBJECT_ID('dbo.tbl2', 'U') IS NOT NULL
	DROP TABLE dbo.tbl2
GO
CREATE TABLE dbo.tbl2 (ID INT IDENTITY PRIMARY KEY, ParentID INT NULL)
GO

IF OBJECT_ID('dbo.tbl1', 'U') IS NOT NULL
	DROP TABLE dbo.tbl1
GO
CREATE TABLE dbo.tbl1 (ID INT PRIMARY KEY)
GO

ALTER TABLE dbo.tbl2 WITH CHECK ADD CONSTRAINT fk FOREIGN KEY(ParentID)
REFERENCES dbo.tbl1 (ID)
GO
ALTER TABLE dbo.tbl2 CHECK CONSTRAINT fk
GO

INSERT INTO dbo.tbl1 (ID)
VALUES (0), (1), (2)
GO

INSERT INTO dbo.tbl2 (ParentID)
VALUES (NULL), (1), (2)

DELETE FROM dbo.tbl1

--Msg 547, Level 16, State 0, Line 26
--The DELETE statement conflicted with the REFERENCE constraint "fk". The conflict occurred in database "msdb", table "dbo.tbl2", column 'ParentID'.

DELETE FROM dbo.tbl1
WHERE ID NOT IN (SELECT t2.ParentID FROM tbl2 t2 WHERE t2.ParentID IS NOT NULL)

--(1 row(s) affected)
25 фев 16, 10:55    [18860939]     Ответить | Цитировать Сообщить модератору
 Re: Конфликт инструкции DELETE с ограничением REFERENCE  [new]
londinium
Member

Откуда: Киев
Сообщений: 1193
автор
Существует ли команда серверу "пропустить неудаляемые записи" или "не останавливаться на ошибках"?

вот прямо такая вряд ли существует. но можно запилить так:
DELETE A FROM TABLEA
 WHERE NOT EXISTS
  (
    SELECT 1 FROM TABLEB B
      WHERE A.ID=B.ID
  )
25 фев 16, 10:57    [18860948]     Ответить | Цитировать Сообщить модератору
 Re: Конфликт инструкции DELETE с ограничением REFERENCE  [new]
Glory
Member

Откуда:
Сообщений: 104760
Михайло_
Не подходит.
Существует ли команда серверу "пропустить неудаляемые записи" или "не останавливаться на ошибках"?

В смысле ? Написать DELETE с подзапросом ?
25 фев 16, 10:59    [18860957]     Ответить | Цитировать Сообщить модератору
 Re: Конфликт инструкции DELETE с ограничением REFERENCE  [new]
Михайло_
Member

Откуда:
Сообщений: 118
Спасибо. Пойду исключать связанные записи. Кто бы сомневался...
25 фев 16, 11:01    [18860972]     Ответить | Цитировать Сообщить модератору
 Re: Конфликт инструкции DELETE с ограничением REFERENCE  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4807
londinium
Удаляйте в курсоре


н-да-да...

А DELETE с JOIN слабо освоить?

DELETE FROM Sales.SalesPersonQuotaHistory 
FROM Sales.SalesPersonQuotaHistory AS spqh
INNER JOIN Sales.SalesPerson AS sp
ON spqh.BusinessEntityID = sp.BusinessEntityID
WHERE sp.SalesYTD > 2500000.00;
GO


https://msdn.microsoft.com/en-us/library/ms189835.aspx
25 фев 16, 12:49    [18861759]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить