Проверка SQL Server 2008 ограничение - PullRequest
0 голосов
/ 18 сентября 2009

У меня есть две таблицы, Table1 и Table2 с одним и тем же первичным ключом (FKTestID).
Если я хочу удалить одну строку в таблице Table1 и тот же FKTestID в таблице 2, это не будет работать. Вы можете удалить строку из Table1 только в том случае, если Table1.FKTestID не равен ни одному FKTestID в Table2.

Пожалуйста, помогите мне с этим ограничением?

Ответы [ 3 ]

3 голосов
/ 18 сентября 2009

Вам нужно установить ограничение на каскад при удалении.

Вы можете сделать это через SQL Management Studio, изменив ограничение.

Или вы можете сделать это через SQL, когда вы создали ограничение, включив ON DELETE CASCADE в конце

Вы также можете сделать это с помощью команды ALTER TABLE .

2 голосов
/ 18 сентября 2009

Вот пример кода, реализующий то, что Саймон предложил выше.

CREATE TABLE dbo.Table1 (
    FKTestID int NOT NULL PRIMARY KEY
)
GO

CREATE TABLE dbo.Table2 (
    FKTestID int NOT NULL PRIMARY KEY
)
GO

ALTER TABLE dbo.Table2
ADD CONSTRAINT FK_Table2_FKTestID
FOREIGN KEY (FKTestID)
REFERENCES dbo.Table1 (FKTestID)
ON DELETE CASCADE
GO

INSERT INTO dbo.Table1 VALUES (1)
INSERT INTO dbo.Table2 VALUES (1)
INSERT INTO dbo.Table1 VALUES (2)
INSERT INTO dbo.Table2 VALUES (2)

DELETE FROM dbo.Table1 WHERE FKTestID = 1

SELECT 'Table1' AS [Table], * FROM dbo.Table1
SELECT 'Table2' AS [Table], * FROM dbo.Table2

=============================================

Table     FKTestID
------ -----------
Table1           2

Table     FKTestID
------ -----------
Table2           2

Обратите внимание, что я согласен с комментарием Митча Уита о том, что CASCADE DELETE опасен. Эта функция интересна, но я никогда не использовал ее в производственной системе.

0 голосов
/ 18 сентября 2009

Если вы спрашиваете, как избавиться от ограничения, чтобы вы могли удалить, НЕ рассматривайте это. Ограничение есть по причине. Если вы не знаете причину, не удаляйте ее.

Другие предложили добавить каскадное удаление. Я полагаю, что это плохая идея, поскольку вы можете вызвать проблемы с производительностью в базе данных. Лучше написать скрипт, который удаляет записи в правильном порядке. В этом случае вам необходимо сначала удалить соответствующие записи из таблиц 2, а затем запустить удаление в таблице 1.

Вам также необходимо оценить данные в таблице2, прежде чем принимать решение об их удалении либо по сценарию, либо по каскадной дельте. Если вам не следует удалять эти записи из таблицы 2, то не следует удалять записи из таблицы 1 (удаляя ограничение), так как это приведет к тому, что записи таблицы 2 будут потеряны, и вы потеряете целостность данных (что должно быть вашей первой заботой в любых действиях с базой данных (безопасность и производительность являются очень близкими вторым и третьим)).

Позвольте мне привести вам сценарий, в котором данные в таблице 2 указывают, что вы не должны удалять запись. Предположим, у вас есть таблица клиентов и таблица заказов. Вы хотите удалить клиента А, но у него был заказ в прошлом. Если вы удалите обе записи, вы испортите всю учетную информацию по заказам. Если вы удаляете клиента, но не заказ (путем устранения ограничения), то у вас есть заказ, который вы больше не можете сказать, кому он был отправлен. В таком случае правильно сделать так, чтобы в таблице клиентов был файл ISactive и пометить его как неактивного клиента. Конечно, вам необходимо изменить код, который ищет информацию о клиенте, чтобы убедиться, что он включает флаг для выбора только активных клиентов, поэтому подобные вещи должны быть продуманы в начале разработки, а не позже (одна из причин, почему стоит потратить время на то, чтобы нанять специалистов по базам данных на этапе проектирования, так как многие разработчики приложений не рассматривают сохранение данных с течением времени как часть процесса проектирования)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...